一、安卓CPU架构梳理
Android 目前共支持7种CPU架构:
mips, mips64, X86, X86–64, arm64-v8a, armeabi, armeabi-v7a
- armeabi:第5代ARM处理器,使用软件浮点运算,兼容所有ARM设备,通用性强,速度慢。它能运行在除了mips和mips64的设备上,但在非 armeabi设备上运行性能还是有所损耗;
- armeabi-v7a:第7代32位ARM处理器,支持硬件浮点运算(支持 armeabi 和 armeabi-v7a,目前大部分手机都是这个架构)
- arm64-v8a:第8代、64位ARM处理器(支持 armeabi-v7a、armeabi 和 arm64-v8a)
- X86:电脑、平板CPU架构,因此手机模拟器也通常为X86,设备兼容X86、armeabi
- x86_64:电脑、平板CPU架构,设备兼容X86_64、X86、armeabi
- mips、mips64:基本没见过
他们关系用表格表示如下:
Platform | 32-bit libraries | 64-bit libraries | 所属公司 |
---|---|---|---|
ARM | armeabi-v7a | arm64-v8a | 英国ARM |
x86 | x86 | x86_64 | 美国Intel |
mips | mips | mips64 | 美国MIPS |
二、单ABI适配方案
ABI:英文Application Binary Interface的缩写,也就是应用二进制接口。不同的CPU 与指令集的每种组合都有 定义的 ABI (应用程序二进制接口),一段程序只有遵循这个接口规范才能在该 CPU 上运行。
目前手机市场上,x86 / x86_64/armeabi/mips / mips6 的架构,基本可以不不考虑了,它们的占有量应很少很少了,arm64-v8a作为最新一代架构,应该是目前的主流,armeabi-v7a只存在少部分老旧手机。
因此我们主要针对armeabi适配,如果你没有模拟器的适配需求的话。
2.1、只适配armeabi
优点:基本上适配了全部CPU架构(除了淘汰的mips和mips_64)
缺点:性能低,相当于在绝大多数手机上都是需要辅助ABI或动态转码来兼容
2.2、只适配 armeabi-v7a
优点:兼容性强,支持armeabi-v7a和arm64-v8a,包体积小、性能也相对较强(支持硬件浮点),属于前几年主流适配方案
缺点:无法发挥现在64位机器的性能,64位机器需要向下兼容到32位
2.3、只适配 arm64-v8
优点:性能最佳,包体积小
缺点:兼容性差,只能运行在arm64-v8的64位机器上
三、应用商店64位APP上架适配
目前64位适配方案:armeabi-v7a、arm64-v8。用一张图表示整个查找过程
![image-20220127202810611](https://i-blog.csdnimg.cn/blog_migrate/f5db9de5492380139c55b13a6e736e62.png)
方案一:同时适配armeabi-v7a、arm64-v8
这是目前使用比较多的适配方案,我们在app -> Gradle的ndk abiFilters中配置即可
优点:兼容性强、性能高,支持64位,省事(只打一个包)
缺点:打包时需要把"armeabi-v7a", "arm64-v8a"下两份so库合到一个包,包体积较大
评价:目前适配64位懒人做法
android {
defaultConfig {
...
ndk {
abiFilters "armeabi-v7a", "arm64-v8a"
}
}
...
}
方案二:armeabi-v7a、arm64-v8分开打包
这种也是目前比较主流的适配方案,我们在app -> Gradle的split分包中配置即可
优点:兼容性强、性能高,支持64位,包体积小(目前各大应用市场已经提供32位;64位的包分开上传)
缺点:应用分发时稍微麻烦,需要同时上传32位、64位。
评价:这种是未来的趋势
android {
...
splits {
abi {
reset()
enable true
universalApk false // If true, also generate a universal APK
include "armeabi-v7a", "arm64-v8a"
}
}
...
}
四、android studio配置梳理
4.1、ndk abiFilters
用于配置一个包打多个CPU架构的
ndk {
abiFilters "armeabi-v7a", "arm64-v8a"
}
4.2、Android split分包
用于配置分包
-
enable: 是否启用ABI拆分机制
-
reset():重置ABI列表为只空字符串,一半和include、exclude一起使用,如果要用必须在- - include和exclude前面
-
include:指明要包含哪些ABI,目前使用最多的伪64位处理器的arm64-v8a,其次才是- armeabi-v7a
-
exclude:默认包含下所有ABI,可以移除一些ABI
-
universalApk:是否打包一个通用版本,包含所有的ABI,默认值为 false
splits {
abi {
reset()
enable true
universalApk false // If true, also generate a universal APK
include "armeabi-v7a", "arm64-v8a"
}
}
可以根据配置不同打出多个包
![image-20220127202810611](https://i-blog.csdnimg.cn/blog_migrate/18ea19b28d89c0d9019aa234901b978b.png)
4.3、ndk abiFilters && Android split分包区别
根据需求配置,一般不能同时配置(或者enable置为false),会编译报错