Android App Bundle 简介

Android App Bundle 是一种发布格式,其中包含您应用的所有经过编译的代码和资源,它会将 APK 生成及签名交由 Google Play 来完成。

Google Play 会使用您的 app bundle 针对每种设备配置生成并提供经过优化的 APK,因此只会下载特定设备所需的代码和资源来运行您的应用。您不必再构建、签署和管理多个 APK 来优化对不同设备的支持,而用户也可以获得更小且更优化的下载文件包。

此外,您还可以向应用项目中添加动态功能模块,并将其包含在 app bundle 中。您可以选择在用户首次下载并安装您的应用时排除这些模块中包含的某些功能和资产。使用 Play 核心库,您的应用日后可以请求下载这些模块。Google Play 只会将该模块的代码和资源提供给设备。如果将此功能与对未压缩的原生库的支持结合使用,较大的应用(如游戏)可以降低其存储要求并提高用户留存率。

请观看下面的视频,大致了解为什么应使用 Android App Bundle 发布应用。

使用 Android App Bundle 时,压缩下载大小限制现在为 150MB。您不能将 app bundle 与 APK 扩展文件一起使用。

如果您使用的是 Android Studio 3.2 或更高版本,只需点击几下即可构建 Android App Bundle。不过,添加动态功能模块需要的工作量更大,因为可能涉及到重构应用的某些部分。

本页介绍了开始构建 Android App Bundle 的步骤,还介绍了与 app bundle 和 Dynamic Delivery 相关的一些重要概念。

开始

如需构建 app bundle 并支持 Dynamic Delivery,请按以下步骤操作:

  1. 下载 Android Studio 3.2 或更高版本 - 这是添加动态功能模块和构建 app bundle 最简单的方法。

  2. 添加对 Dynamic Delivery 的支持,具体方法是添加基本模块,组织配置 APK 的代码和资源,以及选择性地添加动态功能模块。

  3. 使用 Android Studio 构建 Android App Bundle。您还可以通过修改运行/调试配置并选择从 app bundle 部署 APK 的选项,从 app bundle 将应用部署到连接的设备。请注意,与仅构建和部署 APK 相比,使用此选项会使构建时间延长。

  4. 使用 Android App Bundle 生成部署到设备的 APK 来测试您的 Android App Bundle

  5. 加入 Google Play 应用签名计划。否则,您无法将 app bundle 上传到 Play 管理中心。

  6. 将您的 app bundle 发布到 Google Play

如需构建包含 Asset Pack 的 app bundle,请参阅动态资产分发简介

Android App Bundle 格式

Android App Bundle 是您上传到 Google Play 的一种文件(文件扩展名为 .aab)。

app bundle 是经过签名的二进制文件,可将应用的代码和资源组织到模块中,如图 1 所示。各个模块的代码和资源的组织方式与 APK 中的相似,这是合理的,因为每个模块都可以作为单独的 APK 生成。然后,Google Play 会使用 app bundle 生成向用户提供的各种 APK,如基本 APK、动态功能 APK、配置 APK 以及多 APK(多 APK 适用于不支持拆分 APK 的设备)。以蓝色标识的目录(如 drawable/values/lib/ 目录)表示 Google Play 用来为每个模块创建配置 APK 的代码和资源。

app bundle 会将您的应用组织到目录中,每个目录表示一个模块。在每个模块目录中,代码和资源的组织方式与典型的 APK 类似。

图 1. 包含一个基本模块、两个动态功能模块和两个 Asset Pack 的 Android App Bundle 的内容。

以下列表更详细地介绍了 app bundle 的部分文件和目录:

  • base/、feature1/ 和 feature2/:其中每个顶级目录都表示一个不同的应用模块。应用的基本模块始终包含在 app bundle 的 base 目录中。不过,为每个动态功能模块的目录提供的名称由模块清单中的 split 属性指定。如需了解详情,请参阅动态功能模块清单
  • asset_pack_1/ 和 asset_pack_2/:对于需要大量图形处理的大型应用或游戏,您可以将资产模块化处理为 Asset Pack。Asset Pack 因大小上限较高而成为游戏的理想之选。您可以按照三种分发模式(即,安装时分发、快速跟进式分发和按需分发)自定义如何以及何时将各个 Asset Pack 下载到设备上。所有 Asset Pack 都在 Google Play 上托管并从 Google Play 提供。如需详细了解如何将 Asset Pack 添加到您的 app bundle,请参阅动态资产分发概览
  • BUNDLE-METADATA/:此目录包含元数据文件,其中包含对工具或应用商店有用的信息。此类元数据文件可能包含 ProGuard 映射和应用的 DEX 文件的完整列表。此目录中的文件未打包到您应用的 APK 中。
  • 模块协议缓冲区 (*.pb) 文件:这些文件提供了一些元数据,有助于向各个应用商店(如 Google Play)说明每个应用模块的内容。例如,BundleConfig.pb 提供了有关 bundle 本身的信息(如用于构建 app bundle 的构建工具版本),native.pbresources.pb 说明了每个模块中的代码和资源,这在 Google Play 针对不同的设备配置优化 APK 时非常有用。
  • manifest/:与 APK 不同,app bundle 将每个模块的 AndroidManifest.xml 文件存储在这个单独的目录中。
  • dex/:与 APK 不同,app bundle 将每个模块的 DEX 文件存储在这个单独的目录中。
  • res/、lib/ 和 assets/:这些目录与典型 APK 中的目录完全相同。当您上传 app bundle 时,Google Play 会检查这些目录并且仅打包满足目标设备配置需求的文件,同时保留文件路径。
  • root/:此目录存储的文件之后会重新定位到包含此目录所在模块的任意 APK 的根目录。例如,app bundle 的 base/root/ 目录可能包含您的应用使用 Class.getResource() 加载的基于 Java 的资源。这些文件之后会重新定位到您应用的基本 APK 和 Google Play 生成的每个多 APK 的根目录。此目录中的路径也会保留下来。也就是说,目录(及其子目录)也会重新定位到 APK 的根目录。

构建和部署 Android App Bundle

App bundle 与 APK 的不同之处在于,您无法将其部署到设备。相反,它是一种发布格式,将您应用的所有经过编译的代码和资源包含在一个构建工件中。因此,在您上传已签名的 app bundle 后,Google Play 构建和签署应用 APK 所需的一切就已准备就绪,并将通过 Dynamic Delivery 向用户提供这些 APK。

如果您使用的是 Android Studio,只需点击几下即可将您的项目构建为已签名的 app bundle。如果您没有使用 IDE,则可以改为从命令行构建 app bundle。然后,将您的 app bundle 上传到 Play 管理中心,以通过 Dynamic Delivery 测试或发布您的应用。

测试您的 app bundle

构建 Android App Bundle 后,您必须测试 Google Play 使用该 Android App Bundle 生成 APK 的情形,以及这些 APK 部署到设备上之后的行为。

如需测试 app bundle,请使用以下任一方法:

使用 Play 核心库下载动态功能模块

如果您的应用包含动态功能,则需要使用 Play 核心库请求、监控和管理动态功能模块下载。如需了解详情,请转到使用 Play 核心库下载模块

如果您想看看该库的实际应用,请试用 Play 核心库示例应用

关于免安装应用的说明

在 Android Studio 3.2 或更高版本中,只要应用足够小,您就可以向 app bundle 添加免安装体验。如需详细了解可创建的各种免安装体验的大小限制,请参阅 Google Play 免安装体验概览

压缩下载大小限制

借助 Android App Bundle 发布可帮助用户以尽可能最小的下载大小安装您的应用,并将压缩下载大小上限提高到 150MB。也就是说,当用户下载您的应用时,安装应用所需的压缩 APK(例如,基本 APK + 配置 APK)的总大小不得超过 150MB。任何后续下载内容(如按需下载动态功能(及其配置 APK))也必须满足此压缩下载大小限制。Asset Pack 不受此大小限制,但它们有其他大小限制

上传 app bundle 时,如果 Play 管理中心发现您的应用或其按需功能的可能下载大小超过 150MB,您会收到错误。

请注意,Android App Bundle 不支持 APK 扩展 (*.obb) 文件。因此,如果您在发布 app bundle 时遇到此错误,请使用以下某种资源来缩减压缩的 APK 下载大小:

  • 请务必为每种类型的配置 APK 设置 enableSplit = true启用所有配置 APK。这样可以确保用户只下载在其设备上运行您的应用所需的代码和资源。
  • 请务必移除不用的代码和资源以缩减应用大小
  • 遵循最佳做法以进一步缩减应用大小
  • 考虑将只有部分用户使用的功能转换为应用可以在之后按需下载的动态功能模块。请注意,这可能需要对您的应用稍微进行重构,因此请务必先尝试上述其他建议。

已知问题

以下是在构建 Android App Bundle 或使用 Dynamic Delivery 提供应用时会出现的当前已知问题。如果您遇到下文尚未说明的问题,请报告错误

  • 部分安装旁加载的应用(即,未通过 Google Play 商店安装且缺少一个或多个必需拆分 APK 的应用)在所有经过 Google 认证的设备上以及搭载 Android 10(API 级别 29)或更高版本的设备上都会失败。通过 Google Play 商店下载您的应用时,Google 会确保安装应用的所有必需组件。
  • 如果您使用会动态修改资源表的工具,则从 app bundle 生成的 APK 可能会行为异常。因此,在构建 app bundle 时,建议您停用此类工具。
  • 在动态功能模块的清单中,您不得引用基本模块中不存在的资源。这是因为,在 Google Play 生成应用的基本 APK 时,会将所有模块的清单合并到基本 APK 的清单中。因此,如果基本 APK 的清单引用了基本 APK 中不存在的资源,资源关联就会断开。
  • 从 Android Studio 3.2 Canary 14 开始,当您针对应用的基本模块更改构建变体时,系统不会为依赖基本模块的动态功能模块自动选择相同的构建变体。因此,您可能会在构建应用时收到错误。只需确保为基本模块和依赖于它的其他模块选择相同的构建变体即可。
  • 目前可以在动态功能模块的构建配置中配置与基本模块或其他模块中的属性相冲突的属性。例如,您可以在基本模块中设置 buildTypes.release.debuggable = true,而在动态功能模块中将其设置为 false。此类冲突可能会导致构建和运行时问题。请注意,默认情况下,动态功能模块会从基本模块继承一些构建配置。因此,请务必了解在动态功能模块构建配置中应保留哪些配置以及应省略哪些配置。
  • 为了下载动态功能模块,设备必须安装较新版本的 Play 商店应用。因此,如果您的应用包含动态功能模块,那么很少一部分用户的下载内容可能会回退到经过优化的单个多 APK,这会为搭载 Android 4.4(API 级别 20)及更低版本的设备提供相同的下载体验。

其他资源

要详细了解 Android App Bundle,请参阅以下资源。

示例

Codelab

  • 您的首个 Android App Bundle:一个探索 Android App Bundle 基本原理的 Codelab,向您展示了如何使用 Android Studio 快速开始构建您自己的 App Bundle。此 Codelab 还探讨了如何使用 bundletool 测试 app bundle。
  • 按需模块:可帮助您打造按需下载和安装动态功能的应用。

博文

视频