ABI概述
ABI 是英文单词Application Binary Interface
首字母的缩写,翻译过来就是应用程序二进制接口,它定义了二进制文件尤其是.so
文件如何运行在相应的系统平台上,从使用的指令集,内存对齐到可用的系统函数库。Android系统每一个CPU架构对应一个ABI,目前主流的有:armeabi,armeabi-v7a,x86,mips,arm64-v8a,mips64,x86_64。
so
(shared object,共享库)是机器可以直接运行的二进制代码,是Android上的动态链接库,由C/C++
编译生成。开发Android应用时,当不能满足一定需求时就会用得so
库。如:加解密算法,音视频编解码等。
so的兼容性
不同架构的CPU其对ABI的兼容如下:
- armeabi设备只兼容armeabi;
- armeabi-v7a设备兼容armeabi-v7a、armeabi;
- arm64-v8a设备兼容arm64-v8a、armeabi-v7a、armeabi;
- x86设备兼容x86、armeabi;
- mips64设备兼容mips64、mips;
- mips只兼容mips;
通过上面的兼容性总结如下:
armeabi
是大部分CPU
都兼容的,除了mips
和mips64
外,在非armeabi
设备上运行性能和兼容性是有损耗的。- 64位架构的
CPU
向下兼容其对应的32位。
知道了ABI、so
的概念和so的兼容性,开发中针对实际项目如何选取适配不同的机型呢?先看三张大厂应用中so的分布图 :
上面三张图分别是花椒直播、微信、支付宝应用中使用so
的信息分布信息,(通过应用Native Libs Monitor 分析得到上图),通过分析得出:
- 直播app中针对音视频编解码要求比较高,既对性能要求高;也考虑到兼容性和apk的大小等问题选择了
armeabi-v7a
; - 微信和支付宝都使用了
armeabi
也是根据自身的需求来定的,微信的lib下虽然只有armeabi
一个目录,但目录内的文件仍放着armeabi、armeabi-v7a
架构的so
文件,上图中在so名称最后就可以看出,这样做目的是处理兼容带来的某些性能运算问题。
最终开发过程中选取
so
文件要根据项目实际情况通过从各方面综合考虑来定。
在项目中只提供一种ABI
的so
在gradle中配置如下:
android {
...
defaultConfig {
ndk {
abiFilters 'armeabi'// 指定ndk需要兼容的ABI(这样其他依赖包里x86,armeabi-v7a之类的so会被过滤掉)
}
}
}