ABI 7种CPU架构:
armeabi ,armeabi-v7a ,arm64-v8a ,x86,x86_64 , mips , mips64
google 官网给出了的只有前面5种;

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的资料得到这个结论。

Intel系列:
1:x86_64 向下兼容 x86;
1:从表格中可以直接看出,x86_64 是向下兼容 x86的;
Android 工程加载so库
Android ABI 配置
当项目要使用到动态链接库的时候,一般都会在工程下提交jniLibs的文件夹,来单独管理so文件,同时还会根据不同的abi类型创建不同的abi so 库的文件夹。如:

当程序构建成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目录下。
网友评论