关于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文件)
可以将Biugo的主模块拆分为图三所示的Apk全集。
图二

图三

3.构建Android App Bundle

3.1 Server-Side构建(Jenkins)

详见Google文档[3],通过Google提供的bundletool[2]工具生成.aab,使用jarsigner[4]
对.aab进行前面,jenkins部署还需注意aapt2版本问题,如图四所示。
图四

3.2 AndroidStudio构建

  1. 如图五,图六所示,在Build菜单构建带有签名的.aab(生成app.aab)。本文中将所有相关资源移入~/Downloads/目录中,方便演示。  
  2. 下载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密码
  3. 如图八所示,解压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]

参考文献


评论

  1. 您好,请教一下您画图用的是什么工具,可以推荐一下吗,谢谢

    回复删除

发表评论

此博客中的热门博文

Android Studio中kapt调试annotation processor的一些注意事项

用Android Studio将项目上传到JCenter和Maven Central遇到的一些问题及解决办法