Intel使用CISC(复杂指令集计算机)
ARM使用RISC(精简指令集计算机)
1. Android目前有以下七种cpu架构,其区别是指令集不同
ARMv5 第5/6代的ARM处理器,缺少对浮点数计算的硬件支持,使用软件浮点运算,在需要大量计算时有性能瓶颈。只支持armeabi。虽然速度慢,但通用性强,仍需要兼容。
ARMv7 第7代及以上的ARM处理器,目前主流版本。使用硬件浮点运算,具有高级扩展功能。支持 armeabi-v7a 和 armeabi。
ARMv8 第8代、64位ARM处理器,支持 arm64-v8a、armeabi-v7a和armeabi(可用32位模式运行armeabi-v7a和armeabi)。很少设备,三星 Galaxy S6是其中之一。x86 32位 intel处理器,一般用于平板,支持 armeabi(性能有所损耗) 和 x86。市场占有率很低
x86_64 64位 intel处理器,一般用于平板,支持 x86 和 x86_64。市场占有率很低MIPS/MIPS64:极少用于手机,可忽略。
CPU架构 | 支持ABIs | 最优ABI |
ARMv5 | armeabi(1) | armeabi |
ARMv7 | armeabi(2)|armeabi-v7a(1) | armeabi-v7a |
ARMv8 | armeabi(3)|armeabi-v7a(2)|arm64-v8a(1) | arm64-v8a |
x86 | armeabi(3)|armeabi-v7a(2)|x86(1) | x86 |
x86_64 | armeabi(4)|armeabi-v7a(3)|x86(2)|x86_64(1) | x86_64 |
MIPS | mips(1) | mips |
MIPS64 | mips(2)|mips64(1) | mips64 |
表中的数字表示最终选择安装的ABI的优先级,1为最高。
2. 查看手机CPU支持的最优的AIBs方式
1). 如何查看手机支持的cpu架构和app适配的cpu架构
下载App:Native Libs Monitor - Device Details可以看到Support ABIs
armeabi-v7a, armeabi
2). 使用指令 adb shell getprop ro.product.cpu.abi ,也可以查看支持的最优的AIBs
3). 通过Build.SUPPORTED_ABIS也可以查看支持的最优的AIBs
3. CPU是向下兼容的,支持arm64-v8a,就会支持armeabi-v7a和armeabi。
若arm64-v8a文件夹中没有a.so库,armeabi-v7a文件夹有a.so库,且app-build.gradle-defaultConfig-ndk-abiFilters里没有指定ndk需要的ABI,会默认找它支持且优先级最高的ABIs
(可通过easydeviceinfo查看当前cup支持的ABIs),若最高支持arm64-v8a,就会报错
解决方法:
1). 在build.gradle中指定ndk需要兼容的架构为armeabi-v7a
2). 在build.gradle中指定ndk需要兼容的架构为arm64-v8a,且arm64-v8a文件夹中有a.so库
4. 为了减小apk体积,只保留armeabi和armeabi-v7a两个目录,并保证这两个目录中so库数量一致。对只提供armeabi版本的第三方so库,原样复制一份到armeabi-v7a目录中。
具体适配的cpu架构,以在app>build.gradle文件中android->defaultConfig 里设置的支持的 ndk 为准:
ndk {
abiFilters "armeabi-v7a" // 指定要ndk需要兼容的架构(这样其他依赖包里mips,x86,armeabi,arm-v8之类的so会被过滤掉)
}
5. 参考