Android ABI 整理

ABI 7种CPU架构:

armeabi ,armeabi-v7a ,arm64-v8a ,x86,x86_64 , mips , mips64

google 官网给出了的只有前面5种;

table 1 (ABI)

armeabi 第5代 ARM v5TE,使用软件浮点运算,兼容所有ARM设备,通用性强,速度慢(只支持armeabi)
armeabi-v7a 第7代 ARM v7,使用硬件浮点运算,具有高级扩展功能(支持 armeabi 和 armeabi-v7a,目前大部分手机都是这个架构)
arm64-v8a 第8代,64位,包含AArch32、AArch64两个执行状态对应32、64bit(支持 armeabi-v7a、armeabi 和 arm64-v8a)
x86 intel 32位,一般用于平板(支持 armeabi(性能有所损耗) 和 x86)
x86_64 intel 64位,一般用于平板(支持 x86 和 x86_64)

mips 基本没见过(支持 mips)
mips64 基本没见过(支持 mips 和 mips_64)

这里总结两个结论:

Arm系列:

1:arm64-v8a 向下兼容 armeabi-v7a;

2: armeabi-v7a 向下兼容 armeabi;

1:从表格中可以直接看出,armeabi-v7a 是向下兼容 armeabi的;
2:上述表格是不能直接得到 arm64-v8a 向下兼容 armeabi-v7a的信息的。
可以通过查看ARMv8 Technology Preview的资料得到这个结论。

table 2

Intel系列:

1:x86_64 向下兼容 x86;

1:从表格中可以直接看出,x86_64 是向下兼容 x86的;

Android 工程加载so库

Android ABI 配置

当项目要使用到动态链接库的时候,一般都会在工程下提交jniLibs的文件夹,来单独管理so文件,同时还会根据不同的abi类型创建不同的abi so 库的文件夹。如:


table 3

当程序构建成APK ,运行在手机设备上时,设备会根据当前手机的CPU 架构(ABI 指令极类型),去指定的文件目录下查找对应的so库,如果如果没找到对应设备的so库,还会在向下兼容的文件夹查找(具体细节 得参考下 下面的
Android 适配so库),如果最终还是找不到就会报错。

我们可以在gradle 文件中添加如下配置abi类型。

android {
    defaultConfig {
       ndk {
            //设置支持的SO库架构
            abiFilters 'armeabi-v7a'//, 'x86'
        }
    }
}

Android 适配so库

1:项目如果要添加某一个ABI 指令集的so库,比如armeabi-v7a,那armeabi-v7a文件下,必须包含所有该ABI指令集的所有so库,不能一部分在armeabi-v7a下,一部分在armeabi下。

2:如果so提供的文件有缺失,兼容ABI的so可以拷贝到高指令集的ABI目录下。

你可能感兴趣的:(Android ABI 整理)