基础认识
1.armeabi-v7a: 第7代及以上的 ARM 处理器,很多手机还在使用。
2.arm64-v8a: 第8代、64位ARM处理器,目前主流手机CPU架构。
3.armeabi: 第5代、第6代的ARM处理器,早期的手机用的比较多。
4.x86: 平板、模拟器用得比较多。
5.x86_64: 64位的平板。
目前手机基本使用的都是ARM架构,X86架构平板在使用。armeabi架构是早期使用,现在基本只用考虑v7和arm64-v8a两种。
google官方文档对Android ABI架构的说明:https://developer.android.com/ndk/guides/abis?hl=zh-cn
指定ABI构建APK
默认情况下,Gradle(无论是通过 Android Studio 使用,还是从命令行使用)会针对所有非弃用 ABI 进行构建。要限制应用支持的 ABI 集,请使用 abiFilters。例如,要仅针对 64 位 ABI 进行构建,请在 build.gradle 中设置以下配置:
android {
defaultConfig {
ndk {
abiFilters 'arm64-v8a', 'x86_64'
}
}
}
如果需要适配多种CPU架构,建议使用分包方式或者Google推荐的App Boudle。
前者直接将不同ABI的so集成到对应APK中,输出CPU架构对应的APK,例如
app-hdpiX86-release.apk:仅包含适用于 hdpi 密度和 x86 ABI 的代码和资源。
app-hdpiX86_64-release.apk:仅包含适用于 hdpi 密度和 x86_64 ABI 的代码和资源。
app-mdpiX86-release.apk:仅包含适用于 mdpi 密度和 x86 ABI 的代码和资源。
app-mdpiX86_64-release.apk:仅包含适用于 mdpi 密度和 x86_64 ABI 的代码和资源。
后者利用google play应用分发机制,先上传打包好的aab文件,google后台会将aab分割成多个apk,包括base.apk以及组合了abi、资源文件、density等属性的apk ,用户通过google play安装应用时会将这些apk进行组合后安装到设备上。另外也可以通过google提供的本地工具bundletool对aab文件进行处理获取apks文件,选取合适的进行本地安装即可,本篇不详细展开讲解。
查看手机CPU架构
可使用两个shell命令查看
adb shell getprop ro.product.cpu.abi
或者
adb shell
cat /proc/cpuinfo
ABI类型和CPU架构兼容关系
需要注意的是
- 64位设备(arm64-v8a, x86_64, mips64)能够运行32位的函数库,但是以32位模式运行,在64位平台上运行32位版本的ART和Android组件,将丢失专为64位优化过的性能(ART,webview,media等等)
- 当一个应用安装在设备上,只有该设备支持的CPU架构对应的.so文件会被安装。选择abi的顺序:会安装优先级较高的ABI目录,则其它优先级较低的ABI目录(包括其它module中的ABI目录),都无法安装。例如:在cpu是ARMv7架构的手机上,如果检测到armeabi-v7a,就会选择安装armeabi-v7a,则armeabi下的文件,都无法安装了。