Android打包时我们如何选择平台(ABI)

时间:2024-05-23 11:31:44

Android的abi一度曾有7个平台:armeabi、armeabi-v7a、arm64-v8a、x86、x86_64、mips、mips_64,其中arm64-v8a、x86_64、mips_64为64位CPU指令集架构,其余的为32位CPU指令集架构,这里先给出结论:armeabi-v7a和arm64-v8a。
1、armeabi是比较旧的了,2011年以后生产的机子基本上都是armeabi-v7a
2、mips和mips_64,说真的,小编还没真不知道哪款设备的CPU是用的这个,况且现在谷歌NDK 以前支持 ARMv5 (armeabi) 以及 32 位和 64 位 MIPS,但 NDK r17 已不再支持。
3、x86、x86_64好像是Intel处理器的,PC端Intel处理器很牛逼,但在移动端是Arm的天下了,机子也不多,前几年的联想、LG好像出过几款,现在都停产了。
4、armeabi-v7a可以兼容x86、mips运行的,带来的就是性能上的损耗。
5、现在的手机基本上都是64位了,且谷歌市场要求APP需要支持64位。
6、小编特意去微信官网下载APP来看了一下,竟发现微信有个通用版,还有个64位版本,估计是因为包太大了,区分开来,通用版的只有armeabi-v7a一种,而64位的只有arm64-v8a一种,如下图:
Android打包时我们如何选择平台(ABI)
Android打包时我们如何选择平台(ABI)
我在谷歌官网也找到如下:

为实现最佳性能,应直接针对主要 ABI 进行编译。例如,基于 ARMv5TE 的典型设备只会定义主 ABI:armeabi。相反,基于 ARMv7 的典型设备将主 ABI 定义为 armeabi-v7a,并将辅助 ABI 定义为 armeabi,因为它可以运行为每个 ABI 生成的应用原生二进制文件。

64 位设备也支持其 32 位变体。以 arm64-v8a 设备为例,该设备也可以运行 armeabi 和 armeabi-v7a 代码。但请注意,如果应用以 arm64-v8a 为目标,而非依赖于运行 armeabi-v7a 版应用的设备,则应用在 64 位设备上的性能要好得多。

许多基于 x86 的设备也可运行 armeabi-v7a 和 armeabi NDK 二进制文件。对于这些设备,主 ABI 将是 x86,辅助 ABI 是 armeabi-v7a。

总结一下在项目中的表现就是:如果项目只包含了 armeabi(之前微信的app就是只有这种,现在改成armeabi-v7a),那么在所有Android设备都可以运行; 如果项目只包含了 armeabi-v7a,除armeabi架构的设备外都可以运行; 如果项目只包含了 x86,那么armeabi架构和armeabi-v7a的Android设备是无法运行的; 如果同时包含了 armeabi, armeabi-v7a和x86,所有设备都可以运行,程序在运行的时候去加载不同平台对应的so,这是较为完美的一种解决方案,同时也会导致包变大,但是现在的x86手机很少。

综上所述:我们APP只需要armeabi-v7a和arm64-v8a这两个平台的兼容就行。

参考文献:
https://blog.****.net/Insomniaaaaaaa/article/details/50972565?locationNum=8
https://developer.android.com/ndk/guides/abis.html