关于Google Play新打包格式aab(Android App Bundle)的调研简报
关于Google Play新打包格式aab(Android App Bundle)的调研简报
1.背景
根据 Google Play 的政策,从 2019 年 8 月开始,所有在 Play 上架的新应用和已有应用的更新都必须包含原生 64 位版本(主要指应用内的.so文件),若Biugo提供了64位支持但继续使用老的Universal-Apk(包含应用所有资源,可安装在任意支持的设备上)的打包方式,包体直接增大20多MB(.so文件的大小)。Google在文档中明确说明了安装包的大小会影响卸载率和留存[1]。
2.Android App Bundle打包格式
Google Play所支持的新的打包格式,文件后缀为.aab。如图一所示,aab包含基础模块(Base Module)和各个动态功能模块(Dynamic Feature Module),每个模块包含该模块所需
图一
的所有资源(dex、res、assets、lib),对于现阶段的Biugo来说,只会有一个Base Module。通过Google提供的bundletool[2]工具,如图二所示,可以让每个模块生成一个Apk全集(Apks Set),Apk全集包含四个子集:
- Base or Dynamic Feature Apk(java代码)
- Density Configuration Apks Set(根据不同屏幕尺寸、分辨率划分的图片等资源的子集)
- Language Configuration Apks Set (语言资源的子集)
- ABI Configuration Apks Set(根据cpu架构划分的native资源的子集,主要是so文件)
3.构建Android App Bundle
3.1 Server-Side构建(Jenkins)
详见Google文档[3],通过Google提供的bundletool[2]工具生成.aab,使用jarsigner[4]
3.2 AndroidStudio构建
- 如图五,图六所示,在Build菜单构建带有签名的.aab(生成app.aab)。本文中将所有相关资源移入~/Downloads/目录中,方便演示。
- 下载bundletool工具[2]用以下命令生成带签名的Apk全集(out.apks),如图七所示。
cd ~/Downloads/
java -jar bundletool-all-0.9.0.jar build-apks --bundle=app.aab --output=out.apks -- ks=keystore文件 --ks-pass=pass:keystore密码 --ks-key-alias=keystore别名 --key-pass=pass:key密码 - 如图八所示,解压out.apks后可见其包含的所有子集。
图五
4.将Apks部署到Android Device(本地测试)
只能通过bundletool[2]工具将Apks部署到Android Device,用adb手动连续安装多个Apk会报错。
4.1 在Apk全集中寻找合适的子集依次安装到目标设备
执行以下命令即可。
java -jar bundletool-all-0.9.0.jar install-apks —apks=out.apks
注意对于Google Play版本过低或Android版本为4.x及以下的设备,bundletool[2]工具不会寻找适合的Apk子集依次安装,而会直接安装例如图八中的standalone-armeabi_v7a_xxhdpi.apk。
4.2 生成适用于目标设备配置的Apk子集
先创建一个描述目标设备配置的json文件,如下所示,将之命名为device-spec.json。该json实际上描述的是Pixel 2XL。也可通过命令(java -jar bundletool-all-0.9.0.jar get-device-spec —output=device-spec.json)直接获取所连接设备的配置文件,无需手动创建。
{
"supportedAbis": ["arm64-v8a", "armeabi-v7a", "armeabi"],
"supportedLocales": ["en-US", "pt-BR"],
"screenDensity": 560,
"sdkVersion": 28
}
执行以下命令生成使用于该设备配置的Apk子集
java -jar bundletool-all-0.9.0.jar build-apks --device-spec=device-spec.json --bundle=app.aab --output=device_specific_out.apks -- ks=keystore文件 --ks-pass=pass:keystore密码 --ks-key-alias=keystore别名 --key-pass=pass:key密码
如图九所示,解压device_specific_out.apks可看到其包含的Apk子集:
- base-master.apk主模块dex
- base-xxxhdpi.apk图片等资源
- base-en.apk、base-pt.apk语言资源
- base-armeabi.apk为native资源
图九
4.3 估算下发给目标设备的Apk子集的下载包总大小(estimated download sizes of APKs in an APK set)
执行如下命令即可
java -jar bundletool-all-0.9.0.jar get-size total --apks=out.apks
可选参数主要为
—device-spec=path
--dimensions=dimensions
更多参数详见Google文档[2]
如图十所示,针对Biugo项目2.4.0 maint分支,android app bundle下发给目标设备的下载包体积区间为[43358422bytes,43811905bytes]。如图十一所示,jenkins构建的biugo-2.4.0-SNAPSHOT-4000-official.apk体积为46111434bytes。
图十一
5.使用Google Play进行测试
- 可以在Google Play开启内部测试,在https://play.google.com/apps/publish/internalappsharing/上传需要用于内部测试的apk或aab,通过生成的分享链接进行下载于测试,最多100名用户可以通过分享链接下载,分享链接有效期为60天,详见Google文档[5]。
- 通过Gmail帐号在Google Play上添加测试人员,开启针对特定用户群的测试。详见Google文档[5]。
6. Dynamic Feature Module
Dynamic Feature Module是可动态下发的功能模块,举个例子,淘宝客户端拥有买家功能模块和卖家功能模块,用户在Google Play上安装淘宝后默认只含有买家功能模块,当用户登录帐号后,淘宝认定该用户是一名卖家,那淘宝可以在适合的地方显示卖家功能模块的入口按钮,点击该按钮后,Google Play下发卖家功能模块给用户(有下载过程),下载安装完成后再让用户进入卖家功能模块。
使用Dynamic Feature Module可以进一步减少包体,从而降低卸载率。
7. 结论
若在乎包体大小对卸载率和留存带来的影响,则一定要使用app bundle[1]。
您好,请教一下您画图用的是什么工具,可以推荐一下吗,谢谢
回复删除