相容和檔案讀取順序
arm64-v8a是可以向下相容的,其下有armeabi-v7a,armeabi
armeabi-v7a向下相容armeabi
相容得不夠智能:
對于一個cpu是arm64-v8a架構的手機,它運作app時,進入jnilibs去讀取庫檔案時,先看有沒有arm64-v8a檔案夾:
如果沒有該檔案夾,去找armeabi-v7a檔案夾,如果沒有,再去找armeabi檔案夾,如果連這個檔案夾也沒有,就抛出異常
如果有arm64-v8a檔案夾,那麼就去找特定名稱的.so檔案,注意:如果沒有找到,不會再往下(armeabi-v7a檔案夾)找了,而是直接抛出異常
armeabi與armeabi-v7a的差別
armeabi就是針對普通的或舊的arm cpu,armeabi-v7a是針對有浮點運算或進階擴充功能的arm cpu。
android從2.2開始支援armeabi-v7a
早期的Cortex-A系列處理器(A5、A7、A8、A9、A12、A15和A17)基于 ARMv7-A架構
高通820 四核心ARMv8
三星Exynos 8890 ARM Cortex-A53
麒麟950 四核A72+四核A53
從cpu規格表可以看出,目前市面上主流手機cpu多屬于armeabi-v7a。
cpu天梯圖和規格表:
http://www.mydrivers.com/zhuanti/tianti/01/
http://www.mydrivers.com/zhuanti/tianti/01/index_other.html
行業現狀
對4家APK進行Analyze,可以發現Facebook和Twitter隻使用了armeabi-v7a,而微信和淘寶隻使用了armeabi,分析結果如下圖所示:
另外,攜程、餓了麼、百度糯米都是隻使用了armeabi,阿裡系的淘票票使用了armeabi、x86
結論
從包體積大小、相容性和性能上考慮,可以隻保留armeabi-v7a。同時,為了避免引用的第三方庫中有arm64-v8a的so檔案導緻64位機器仍然從arm64-v8a檔案夾讀取so檔案,将非armeabi-v7a的so檔案全部過濾掉:加入ndk .abiFilters
defaultConfig {
applicationId "xx.xx.x.xx"
minSdkVersion 15
targetSdkVersion 22
versionCode 15
versionName "1.2.7"
multiDexEnabled true
ndk {
abiFilters "armeabi-v7a" // 指定要ndk需要相容的架構(這樣其他依賴包裡mips,x86,armeabi,arm-v8之類的so會被過濾掉)
}
}
引用
https://blog.csdn.net/hss01248/article/details/51505531
https://blog.csdn.net/ecjtuhq/article/details/79440986