Android 应用包是一个文件(扩展名为.aab
),您将其上传到 Google Play。
应用包是已签名的二进制文件,它将应用的代码和资源组织到模块中,如图 1 所示。每个模块的代码和资源的组织方式与您在 APK 中找到的类似——这是有道理的,因为这些模块中的每一个都可能生成单独的 APK。然后,Google Play 使用应用包生成提供给用户的各种 APK,例如基本 APK、功能 APK、配置 APK 以及(对于不支持拆分 APK 的设备)多 APK。以蓝色着色的目录——例如drawable/
、values/
和lib/
目录——表示 Google Play 用于为每个模块创建配置 APK 的代码和资源。
以下列表更详细地描述了应用包的一些文件和目录
- base/、feature1/ 和 feature2/:这些顶级目录中的每一个都代表应用的不同模块。应用的基本模块始终包含在应用包的
base
目录中。但是,每个功能模块的目录名称由模块清单中的split
属性指定。要了解更多信息,请阅读有关功能模块清单的内容。 - asset_pack_1/ 和 asset_pack_2/:对于大型、图形要求高的应用或游戏,您可以将资源模块化到资源包中。由于其较大的大小限制,资源包非常适合游戏。您可以根据三种交付模式自定义每个资源包在设备上的下载方式和时间:安装时、快速后续和按需。所有资源包都托管在 Google Play 上并由 Google Play 提供服务。要了解如何将资源包添加到应用包中,请参阅Play 资源交付概述。
- BUNDLE-METADATA/:此目录包含元数据文件,其中包含对工具或应用商店有用的信息。此类元数据文件可能包括 ProGuard 映射和应用 DEX 文件的完整列表。此目录中的文件不会打包到应用的 APK 中。
- 模块协议缓冲区(
*.pb
)文件:这些文件提供元数据,有助于向应用商店(例如 Google Play)描述每个应用模块的内容。例如,BundleConfig.pb
提供有关包本身的信息,例如用于构建应用包的构建工具的版本,而native.pb
和resources.pb
描述每个模块中的代码和资源,这在 Google Play 针对不同的设备配置优化 APK 时非常有用。 - manifest/:与 APK 不同,应用包在此单独的目录中存储每个模块的
AndroidManifest.xml
文件。 - dex/:与 APK 不同,应用包在此单独的目录中存储每个模块的 DEX 文件。
- res/、lib/ 和 assets/:这些目录与典型 APK 中的目录相同。上传应用包时,Google Play 会检查这些目录,并仅打包满足目标设备配置的文件,同时保留文件路径。
root/: 此目录存储的文件稍后将被重新定位到包含此目录所在模块的任何 APK 的根目录。例如,应用包的
base/root/
目录可能包含应用使用Class.getResource()
加载的基于 Java 的资源。这些文件稍后将被重新定位到应用基本 APK 和 Google Play 生成的每个多 APK 的根目录。此目录中的路径也将保留。也就是说,目录(及其子目录)也将被重新定位到 APK 的根目录。
分 APK 概述
提供优化应用的一个基本组件是在 Android 5.0(API 级别 21)及更高版本上提供的分 APK机制。分 APK 与常规 APK 非常相似,它们包含已编译的 DEX 字节码、资源和 Android 清单。但是,Android 平台能够将多个已安装的分 APK 视为单个应用。也就是说,您可以安装多个可以访问公共代码和资源的分 APK,并且在设备上显示为一个已安装的应用。
分 APK 的好处是可以将单体 APK(即包含应用支持的所有功能和设备配置的代码和资源的 APK)分解成较小的、独立的软件包,这些软件包根据需要安装在用户的设备上。
例如,一个分 APK 可能包含仅少数用户需要的附加功能的代码和资源,而另一个分 APK 包含仅针对特定语言或屏幕密度的资源。当用户请求这些分 APK 或设备需要它们时,这些分 APK 将被下载和安装。
下面介绍可能一起安装在设备上以形成完整应用体验的不同类型的 APK。您将在本页后面的部分中了解如何配置应用项目以支持这些 APK。
- 基本 APK:此 APK 包含所有其他分 APK 可以访问的代码和资源,并提供应用的基本功能。当用户请求下载应用时,将首先下载并安装此 APK。这是因为只有基本 APK 的清单包含应用服务的完整声明、内容提供程序、权限、平台版本要求以及对系统功能的依赖关系。Google Play 从项目的应用(或基本)模块生成应用的基本 APK。如果您担心减少应用的初始下载大小,请务必记住,此模块中包含的所有代码和资源都包含在应用的基本 APK 中。
- 配置 APK:每个 APK 都包含针对特定屏幕密度、CPU 架构或语言的原生库和资源。当用户下载应用时,他们的设备将仅下载并安装针对其设备的配置 APK。每个配置 APK 都是基本 APK 或功能模块 APK 的依赖项。也就是说,它们将与提供代码和资源的 APK 一起下载和安装。与基本模块和功能模块不同,您不会为配置 APK 创建单独的模块。如果您使用标准做法来组织基本模块和功能模块的替代的、特定于配置的资源,则Google Play 会自动为您生成配置 APK。
- 功能模块 APK:每个 APK 都包含使用功能模块模块化的应用功能的代码和资源。然后,您可以自定义在设备上下载该功能的方式和时间。例如,使用 Play Core 库,可以在设备上安装基本 APK 后按需安装功能,以向用户提供其他功能。考虑一个聊天应用,该应用仅当用户请求使用该功能时才下载并安装捕获和发送照片的功能。由于在安装时可能无法使用功能模块,因此您应在基本 APK 中包含任何公共代码和资源。也就是说,您的功能模块应假定在安装时仅可以使用基本 APK 的代码和资源。Google Play 从项目的功 能模块生成应用的功能模块 APK。
考虑一个具有三个功能模块并支持多种设备配置的应用。下图 1 说明了应用各种 APK 的依赖关系树可能是什么样的。请注意,基本 APK 构成树的头部,所有其他 APK 都依赖于基本 APK。(如果您好奇这些 APK 的模块如何在 Android 应用包中表示,请参阅Android 应用包格式。)
请记住,您不需要自己构建这些 APK——Google Play 使用您使用 Android Studio 构建的单个签名应用包为您构建这些 APK。要了解有关应用包格式以及如何构建应用包的更多信息,请访问构建、部署和上传 Android 应用包。
运行 Android 4.4(API 级别 19)及更低版本的设备
由于运行 Android 4.4(API 级别 19)及更低版本的设备不支持下载和安装分 APK,因此 Google Play 会改为为这些设备提供一个名为多 APK的单个 APK,该 APK 针对设备的配置进行了优化。也就是说,多 APK 表示您的完整应用体验,但不包含不必要的代码和资源(例如其他屏幕密度和 CPU 架构的代码和资源)。
但是,它们包含应用支持的所有语言的资源。例如,这允许用户更改应用的首选语言设置,而无需下载不同的多 APK。
多 APK 不具备稍后按需下载功能模块的功能。要在此 APK 中包含功能模块,您必须在创建功能模块时禁用按需或启用融合。
请记住,使用应用包,您不需要为应用支持的每种设备配置构建、签名、上传和管理 APK。您仍然只需为整个应用构建和上传一个应用包,Google Play 会为您处理其余工作。因此,无论您是否计划支持运行 Android 4.4 或更低版本的设备,Google Play 都能为您和您的用户提供灵活的服务机制。
用户语言更改
使用应用包,设备仅下载运行应用所需的代码和资源。因此,对于语言资源,用户的设备仅下载与设备设置中当前选择的语言一种或多种匹配的应用的语言资源。
当用户在设备设置中切换语言时,Google Play 可能需要下载并安装一些其他分 APK,然后才能以新语言显示应用。
Google Play 会尝试在切换后立即下载其他语言。如果用户设备处于脱机状态、下载失败或资源过大,则 Google Play 会在设备条件更适宜时在后台再次尝试下载。在运行 Android 9.0(API 级别 28)或更低版本的设备上,如果应用在新语言分 APK 安装期间处于前台,则该应用将被终止。
如果您的应用要求始终在设备上提供所有语言,则可以在构建配置中禁用语言拆分。
如果您的应用需要独立于设备设置中选择的用户语言下载其他语言(例如,要实现应用内语言选择器),则可以使用 Play Core 库按需下载它们。