Android ABI
不同的 Android 设备使用不同的 CPU,而不同的 CPU 支持不同的指令集。CPU 与指令集的每种组合都有专属的应用二进制接口 (ABI)。ABI 包含以下信息:
- 可使用的 CPU 指令集(和扩展指令集)。
- 运行时内存存储和加载的字节顺序。Android 始终是 little-endian。
- 在应用和系统之间传递数据的规范(包括对齐限制),以及系统调用函数时如何使用堆栈和寄存器。
- 可执行二进制文件(例如程序和共享库)的格式,以及它们支持的内容类型。Android 始终使用 ELF。
本页列举了 NDK 支持的 ABI,以期帮助你在减少APK体积及兼容机型上有帮助。
支持的 ABI
表 1. ABI 和支持的指令集。
ABI | 支持的指令集 | 备注 |
---|---|---|
armeabi-v7a | armeabiThumb-2VFPv3-D16 | 与 ARMv5/v6 设备不兼容。 |
arm64-v8a | AArch64 | |
x86 | x86 (IA-32)MMXSSE/2/3SSSE3 | 不支持 MOVBE 或 SSE4。 |
x86_64 | x86-64MMXSSE/2/3SSSE3SSE4.1、4.2POPCNT |
白话版:
- armeabi-v7a:第七代及以上的ARM处理器,2011年以后生产的大部分Android设备都使用。
- arm64-v8a:第8代、64位ARM处理器,很少设备,三星GalaxyS6是其中之一。
- armeabi:第5代、第6代的ARM处理器,早期的手机用的比较多。
- X86:平板、模拟器用得比较多。
- X86_64:64位得平板。
为特定 ABI 生成代码
默认情况下,Gradle(无论是通过 Android Studio 使用,还是从命令行使用)会针对所有非弃用 ABI 进行编译。要限制应用支持的 ABI 集,请使用 abiFilters
。例如,要仅针对 64 位 ABI 进行编译,请在 build.gradle
中设置以下配置:
1 2 3 4 5 6 7 |
android { defaultConfig { ndk { abiFilters 'arm64-v8a', 'x86_64' } } } |
编译系统的默认行为是将每个 ABI 的二进制文件包括在单个 APK(也称为胖 APK)内。与仅包含单个 ABI 的二进制文件的 APK 相比,胖 APK 要大得多;要权衡的是兼容性更广,但 APK 更大。强烈建议您利用 app bundle 和 APK 拆分减小 APK 的大小,同时仍保持最大限度的设备兼容性。
在安装时,软件包管理器只解压缩最适合目标设备的机器代码。
扩展资料
原文连接:ABI盲点:armeabi-v7a、arm64-v8a、armeabi、x86、x86_64的区别
所有媒体,可在保留署名、
原文连接
的情况下转载,若非则不得使用我方内容。