天天看点

jni中arm64-v8a,armeabi-v7a,armeabi文件夹的意义和用法

兼容和文件读取顺序

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,分析结果如下图所示:

jni中arm64-v8a,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