ABI盲点:armeabi-v7a、arm64-v8a、armeabi、x86、x86_64的区别

Android ABI

不同的 Android 设备使用不同的 CPU,而不同的 CPU 支持不同的指令集。CPU 与指令集的每种组合都有专属的应用二进制接口 (ABI)。ABI 包含以下信息:

  • 可使用的 CPU 指令集(和扩展指令集)。
  • 运行时内存存储和加载的字节顺序。Android 始终是 little-endian。
  • 在应用和系统之间传递数据的规范(包括对齐限制),以及系统调用函数时如何使用堆栈和寄存器。
  • 可执行二进制文件(例如程序和共享库)的格式,以及它们支持的内容类型。Android 始终使用 ELF。

本页列举了 NDK 支持的 ABI,以期帮助你在减少APK体积及兼容机型上有帮助。

支持的 ABI

表 1. ABI 和支持的指令集。

ABI支持的指令集备注
armeabi-v7aarmeabiThumb-2VFPv3-D16与 ARMv5/v6 设备不兼容。
arm64-v8aAArch64
x86x86 (IA-32)MMXSSE/2/3SSSE3不支持 MOVBE 或 SSE4。
x86_64x86-64MMXSSE/2/3SSSE3SSE4.1、4.2POPCNT

白话版:

  1. armeabi-v7a:第七代及以上的ARM处理器,2011年以后生产的大部分Android设备都使用。
  2. arm64-v8a:第8代、64位ARM处理器,很少设备,三星GalaxyS6是其中之一。
  3. armeabi:第5代、第6代的ARM处理器,早期的手机用的比较多。
  4. X86:平板、模拟器用得比较多。
  5. X86_64:64位得平板。

为特定 ABI 生成代码

默认情况下,Gradle(无论是通过 Android Studio 使用,还是从命令行使用)会针对所有非弃用 ABI 进行编译。要限制应用支持的 ABI 集,请使用 abiFilters。例如,要仅针对 64 位 ABI 进行编译,请在 build.gradle 中设置以下配置:

编译系统的默认行为是将每个 ABI 的二进制文件包括在单个 APK(也称为胖 APK)内。与仅包含单个 ABI 的二进制文件的 APK 相比,胖 APK 要大得多;要权衡的是兼容性更广,但 APK 更大。强烈建议您利用 app bundle 和 APK 拆分减小 APK 的大小,同时仍保持最大限度的设备兼容性。

在安装时,软件包管理器只解压缩最适合目标设备的机器代码。

扩展资料

https://developer.android.com/ndk/guides/abis.html