问题提出
在开发过程中我对gradle文件中的这个配置存在疑惑,这些abi是个啥?
x86等等这些不是cpu架构吗?这里的关系到底是啥?
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
}
解答
参考 :https://www.sohu.com/a/395038558_611601
什么是ABI?
ABI是英文Application Binary Interface的缩写,即应用二进制接口。
不同Android设备,使用的CPU架构可能不同,因此支持不同的指令集。
CPU 与指令集的每种组合都有其自己的应用二进制界面(或 ABI),ABI非常精确地定义了应用程序的机器代码应如何在运行时与系统交互。
您必须为要与您的应用程序一起使用的每种CPU架构指定一个ABI(Application Binary Interface)。
ABI 包含以下信息:
可使用的 CPU 指令集(和扩展指令集)。
运行时内存存储和加载的字节顺序。Android 始终是 little-endian。
在应用和系统之间传递数据的规范(包括对齐限制),以及系统调用函数时如何使用堆栈和寄存器。
可执行二进制文件(例如程序和共享库)的格式,以及它们支持的内容类型。Android 始终使用 ELF。
如何重整 C++ 名称。
Android目前支持以下7种ABIs:
mips, mips64, X86, X86–64, arm64-v8a, armeabi, armeabi-v7a
ABI有何作用?
当我们想要在项目中使用 native(C/C++) 类库,我们必须对要支持的处理器架构提供对应编译包。每个处理器架构需要我们提供一个或多个包含native代码的.so文件。
默认情况下,为了使APP有更好的兼容性,我们使用Android Studio 或者命令打包时,会默认支持所有的架构,但相应的APK size 会疯狂的增大。
对于用户来说,目标设备只需要其中一个版本,但当用户下载APK时,会全部下载(对用户来说相当的不友好)。
- 构建的时候使用前文提到的代码事根据不同架构进行打包,节省打包后的大小。
通过过滤实现选择性打包apk,一般arm64-v8a
打包可满足最大数的设备需求。