跳到主要内容

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。

图片:AAB 介绍

发布流程的变化

图片:AAB 发布流程

项目配置要求

  • 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 签名文件

    1. 进入 Google Play 控制台。
    2. 选择 测试 > 内部测试
    3. 应用完整性 部分,点击 更改应用签名密匙
    4. 更改应用签名密匙 对话框,点击 使用其他密匙图片:AAB 上传密钥
    5. 选择 Export and upload a key from Java keystore 并根据页面指令上传签名文件。 图片:开启 AAB 上传密钥
  • 已发布应用更新 Google Play 签名文件

    1. 进入 Google Play 控制台。
    2. 选择 设置 > 应用完整性
    3. Upgrade your app signing key for new installs 部分,点击 请求升级密匙图片:AAB 升级密钥
    4. 选择 我需要针对多个版本应用或此应用的预安装版本使用同一密匙 > 上传新的应用签名密匙,并根据页面指令上传签名文件。 图片:开启 AAB 上传密钥

适配方案

  1. 总大小 <=150MB 的 App:
    只需要在打包时选择打 bundle 包即可,其他无需改动。由于 APK Expansion File(OBB) 和 Android App Bundle 不兼容,所以如果之前已经用了 OBB,则参考 2。

  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 自行下载。
  3. 较大型的 app:
    参考 Asset Library 文档,Feature Library 文档,对工程不同模块进行划分,根据模块使用情况选择来加载。

    • install-time: 下载 app 时一并下载,app 装完,这个 Feature Module 也已经可用。
    • on-demand: 仅在需要时由 app 自行下载。
    • conditional: 根据条件在 app 下载时一并下载,通常用于设备满足某种硬件/软件条件时触发。例如设备分辨率,系统 API 版本,OpenGL 版本等等。
  4. 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 已经加载,否则会因为找不到对应代码或资源崩溃。