1. 程式人生 > >jni中arm64-v8a,armeabi-v7a,armeabi文件夾的意義和用法

jni中arm64-v8a,armeabi-v7a,armeabi文件夾的意義和用法

結果 strong The 主流手機 lin div %20 tco 高通

兼容和文件讀取順序

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

jni中arm64-v8a,armeabi-v7a,armeabi文件夾的意義和用法