Android App Bundle 适配
概览
Google 在 2018 年发布了 Android App Bundle (AAB) 这种新的发布格式。Google Play 的最新政策要求在 2021年 8月后新上架的 App 必须按照 Android App Bundle 方式进行打包发布。已经发布的 App 暂时没有影响。
什么是 Android App Bundle
Android App Bundle:Google 推出的新的发布格式。跟传统的 APK 区别在于,Google Play 用 AAB 来批量生成适用于各种设备的 APK,并根据实际用户下载时的设备配置,使用户只需下载对应的 APK。这种发布方式可以减少 APK 大小,并且避免用户安装很多实际不需要的资源。
Play App Signing:由于 APK 的生成改为由 Google Play 完成,自然 APK 的签名也由 Google Play 完成。
Play Feature Delivery:Google 的插件化版本。Feature module 内包含代码和资源等内容,可以根据需要决定什么时候下载和使用。
Play Asset Delivery:Asset 资源分包,取代以前的 APK Expansion File (OBB)。由于 Google Play 有 APK 100MB 限制,以前是用 OBB 文件来解决资源过大的问题。但是 OBB 没有签名验证,也无法根据不同设备加载不同资源,所以 Play Asset Delivery 就是为了针对 Asset 资源分包而存在的。
Android App Bundle Format:
- Base Module 就是主包。
- Dynamic Feature 就是 Play Feature Delivery。
- Asset Pack 就是 Play Asset Delivery。
发布流程的变化
项目配置要求
- Android studio 3.2 以上版本
- Gradle 插件版本 3.2.1之后
- 2020-08-01之后 Google Play 的新建项目只支持 AAB 格式文件
Google Play发布AAB格式文件注意事项
Google Play 官方支持 APK 格式文件更新 AAB 格式文件,必须替换 Google Play 自生成签名文件,替换签名后需发布新版本。
更新 AAB 文件
- 新建项目更新 AAB
可使用 Google Play 自生成签名,亦可以使用自签名覆盖 Google Play 签名 (Google 推荐使用 Google Play 生成签名)。 - 现有 APK 更新 AAB
使用现有 APK 上传签名文件生成对应签名文件,上传到覆盖 Google Play 自生成签名。
更新 Google Play 签名文件
新建项目更新 Google Play 签名文件
- 进入 Google Play 控制台。
- 选择 测试 > 内部测试。
- 在 应用完整性 部分,点击 更改应用签名密匙。
- 在 更改应用签名密匙 对话框,点击 使用其他密匙。
- 选择 Export and upload a key from Java keystore 并根据页面指令上传签名文件。
已发布应用更新 Google Play 签名文件
- 进入 Google Play 控制台。
- 选择 设置 > 应用完整性。
- 在 Upgrade your app signing key for new installs 部分,点击 请求升级密匙。
- 选择 我需要针对多个版本应用或此应用的预安装版本使用同一密匙 > 上传新的应用签名密匙,并根据页面指令上传签名文件。
适配方案
总大小 <=150MB 的 App:
只需要在打包时选择打 bundle 包即可,其他无需改动。由于 APK Expansion File(OBB) 和 Android App Bundle 不兼容,所以如果之前已经用了 OBB,则参考 2。有 OBB 文件,且大小主要是集中在资源文件上的 app:
根据 Asset Library 文档,新建 module 用来存放之前放在 OBB 文件里的资源。最好是对资源做好分类,分 module 做成不同的 Asset Pack 按需加载。- install-time: 下载 app 时一并下载,app 装完,这个 Asset Pack 也已经可用。
- fast-follow:app 安装后,紧跟着 Google Play 会继续下载 fast-follow 类型的 Asset Pack,所以使用时不保证可用,需要先检查状态。
- on-demand:仅在需要时由 app 自行下载。
较大型的 app:
参考 Asset Library 文档,Feature Library 文档,对工程不同模块进行划分,根据模块使用情况选择来加载。- install-time: 下载 app 时一并下载,app 装完,这个 Feature Module 也已经可用。
- on-demand: 仅在需要时由 app 自行下载。
- conditional: 根据条件在 app 下载时一并下载,通常用于设备满足某种硬件/软件条件时触发。例如设备分辨率,系统 API 版本,OpenGL 版本等等。
Legacy Support:
API level <= 19 (Android 4.4) 虽然不支持分包方式安装,但 Google Play 会做好处理。Google Play 依然会生成较为精简的 APK,不过滤语言,但会过滤分辨率和 CPU 架构的 APK 给用户下载。需要注意的是,如果有模块是配了 on-demand 方式加载的,需要评估是否把这个模块也要合进来,如果需要,则要把 fusing 的配置设置为 enable。
配合业务适配
需要保证 Player Network SDK 的模块都必须在主模块或者在 install-time 模块里。
另外需要注意 Feature Module 的依赖。假设业务方选择将 INTLCore 放在 Feature A,INTLFacebook 放在 Feature B,则调用 Feature B 之前必须保证 Feature A 已经加载,否则会因为找不到对应代码或资源崩溃。