第二个 Android 11 开发者预览版现已推出,快来测试并分享您的反馈吧

Android App Bundle 简介

Android App Bundle 是一种全新的上传格式,其中包含您应用的所有编译好的代码和资源,但 APK 生成及签名工作则交给 Google Play 来处理。

Google Play 的新应用服务模式名叫“Dynamic Delivery”,会使用您的 app bundle 针对每位用户的设备配置生成并提供经过优化的 APK,因此他们只需下载运行您的应用所需的代码和资源。您无需再编译、签署和管理多个 APK 来支持不同的设备,而用户也可以下载更小、更优化的下载文件包。

此外,您还可以向应用项目添加动态功能模块,并将其包含在 app bundle 中。除用户首次下载并安装您应用时的基本组件之外,其余的所有其他功能和资产都可以包含在这些模块中。使用 Play 核心库,您的应用日后可以请求将这些模块下载为动态功能 APK。通过 Dynamic Delivery,Google Play 只会将该模块的代码和资源提供给设备。

请观看下面的视频,大致了解为何应使用 Android App Bundle 上传应用。

使用 Android App Bundle 发布时,应用的大小上限也会增加到 150MB,无需使用 APK 扩展文件。请注意,此限制仅适用于实际下载大小,不适用于发布大小。因此,用户可以下载最大为 150MB 的应用,并且通过 Dynamic Delivery,所有存储空间仅用于运行应用所需的代码和资源。如果将此功能与对未压缩的原生库的支持结合使用,较大的应用(如游戏)可以减少磁盘使用量并提高用户留存率。

如果您使用的是 Android Studio 3.2 或更高版本,大部分应用项目可以轻松支持 Dynamic Delivery,并且您只需点击几下即可编译 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

Android App Bundle 格式

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

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

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

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

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

  • base/、feature1/ 和 feature2/:其中每一个顶级目录都表示一个不同的应用模块。应用的基本模块始终包含在 app bundle 的 base 目录中。不过,每个动态功能模块的目录的名称都是由模块清单中的 split 属性指定的名称。要了解详情,请参阅动态功能模块清单
  • 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))也必须满足此压缩下载大小限制。

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

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

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

已知问题

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

  • 如果您使用会动态修改资源表的工具,则根据 app bundle 生成的 APK 可能会行为异常。因此,在编译 app bundle 时,建议您停用此类工具。
  • 在动态功能模块的清单中,您不得引用基本模块中不存在的资源。这是因为,在 Google Play 生成应用的基本 APK 时,会将所有模块的清单合并到基本 APK 的清单中。因此,如果基本 APK 的清单引用了基本 APK 中不存在的资源,资源关联就会断开。
  • 从 Android Studio 3.2 Canary 14 开始,当您针对应用的基本模块更改编译变体时,系统不会为依赖基本模块的动态功能模块自动选择相同的编译变体。因此,您可能会在编译应用时收到错误。只需确保为基本模块和依赖于它的其他模块选择相同的编译变体即可。
  • 目前可以在动态功能模块的编译配置中配置与基本模块或其他模块中的属性相冲突的属性。例如,您可以在基本模块中设置 buildTypes.release.debuggable = true,并在动态功能模块中将其设置为 false。此类冲突可能会导致编译和运行时问题。请注意,默认情况下,动态功能模块会从基本模块继承一些编译配置。因此,请务必了解在动态功能模式编译配置中应保留哪些配置以及应忽略哪些配置。
  • 由于应用安装可能需要下载多个 APK(例如基本 APK 及其一些配置 APK),因此在将应用 APK 手动传输到设备上(也称为“旁加载”)时要小心谨慎。否则,您的应用可能会由于缺少代码和资源而遇到运行时问题。
  • 目前,Google Play 在单个 APK 中包含用于动态功能模块的所有代码和资源。在不久的将来,对于搭载 Android 5.0(API 级别 21)及更高版本的设备,系统将优化传送以使用配置 APK。
  • 要下载动态功能模块,设备必须安装最新版本的 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。
  • 按需模块:可帮助您创建按需下载和安装动态功能的应用。

博文

视频