現在很多android第三方 sdk是以aar形式提供的,甚至是遠程aar,如果這個sdk對abi的支持比較全,可能會包含armeabi, armeabi-v7a,x86, arm64-v8a,x86_64五種abi,而你應用的其它so只支持armeabi,armeabi-v7a,x86三種,直接引用sdk的aar,會自動編譯出支持5種abi的包。
但是應用的其它so缺少對其它兩種abi的支持,那麼如果應用運行於arm64-v8a,x86_64爲首選abi的設備上時,就會CRASH
怎麼解決這個問題?其實arm64-v8a,x86_64這兩個abi應用並不是必須要做支持,手機一般都會提供自動兼容,像微信就是一個armeabi打天下。
所以我們只要把對x86, arm64-v8a,x86_64的支持去掉就可以。怎麼去呢,之前想了一個比較笨的辦法,就是寫個腳本直接把lib目錄下對應的abi文件夾刪掉再重新簽名。
後來找到兩個更方便的辦法
一、需要在build.gradle的android裏添加如下內容:
productFlavors {
necess {
ndk {
abiFilters "armeabi-v7a"
abiFilters "x86"
abiFilters "armeabi"
}
}
abiall {
ndk {
abiFilters "armeabi-v7a"
abiFilters "x86"
abiFilters "armeabi"
abiFilters "arm64-v8a"
abiFilters "x86_64"
}
}
}
生成apk的界面如下圖:
會分別生成app-abiall-release.apk和app-necess-release.apk
如果本來有做渠道包支持,只要添加對應的ndk.abiFilters即可,原理就是設置不同的渠道包指定不同的指令集
二、使用全局設置,這種方法對一般需求來說可能更爲實用
build.gradle的android裏的defaultConfig內添加如下內容:
defaultConfig {
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86"
}
}
然後所有渠道包都會頂多包含此三種指令集