默认情况下,Android和Flutter打包出来的Apk都是包含了所有架构的,这样打出来的apk体积相对于单架构的apk有点大。
这时,我们就需要分别打出不同的架构包。
架构
一般来说,x86代表32位CPU,x64(或者叫x86-64)代表64位CPU。
在Android中,支持专有cpu架构也是Application Binary Interface(ABI)。
Android开发者官网文档中支持的ABI。
armeabi-v7a
此 ABI 适用于基于 32 位 ARM 的 CPU,2016年之前大部分Android手机的cpu都是此架构。
arm64-v8a
此 ABI 适用于基于 ARMv8-A 的 CPU,支持 64 位 AArch64 架构,一般从2016年开始,主流Android手机的cpu架构都是arm64的。
x86
此ABI支持X86架构,像Intel、AMD的cpu都是基于此架构。
在2012-2016这段时间,为了赶上移动互联网的浪潮,Intel和Nvidia专门为Android手机和平板推出过X86架构的CPU,可惜都失败了。现在一般不需要适配此架构,除非APK需要安装在Intel平板上。
x86_64
此ABI支持x86-64位架构的CPU。同上
对于mips
、mips64
、armeabi
这些架构来说,Android从Android Plugin for Gradle 3.1.0
(对应gradle 4.4)后不再支持,因为从NDK r17开始,不再将这些 ABI 作为支持的目标。
APK分包
Android
在模块级的build.gradle文件中,在android代码块中添加splits模块。
基本配置如下。
android { ... splits { // 基于不同的abi架构配置不同的apk abi { // 必须为true,打包才会为不同的abi生成不同的apk enable true // 默认情况下,包含了所有的ABI。 // 所以使用reset()清空所有的ABI,再使用include指定我们想要生成的架构armeabi-v7a、arm-v8a reset() // 逗号分隔列表的形式指定 Gradle 应针对哪些 ABI 生成 APK。只与 reset() 结合使用,以指定确切的 ABI 列表。 include "armeabi-v7a", "arm64-v8a" // 是否生成通用的apk,也就是包含所有ABI的apk。如果设为 true,那么除了按 ABI 生成的 APK 之外,Gradle 还会生成一个通用 APK。 universalApk false } } }
Flutter
使用以下命令后,会自动生成v7a、v8a、x86-64三种架构的apk。
flutter build apk --split-per-abi
生成位置在build/app/outputs/flutter-apk/。