2021 年 8 月,Google 做出了一项决定,从根本上改变了 Android 应用程序的分发方式:所有提交到 Google Play 商店的新应用程序都必须使用 Android 应用程序包 (AAB) 格式,而不是传统的 APK。这种转变影响了开发者、用户以及第三方应用分发的整个生态系统。但 App Bundle 到底是什么、它是如何工作的以及为什么要关心?
本指南涵盖了从 AAB 格式的技术内部原理到想要与朋友共享应用程序或将应用程序安装在没有 Play 商店访问权限的设备上的用户的实际影响的所有内容。
什么是 Android 应用程序包?
Android App Bundle 是一种发布格式,其中包含应用程序的所有已编译代码和资源,但将最终可安装 APK 的生成推迟到 Google Play。将其视为一个主模板,Google 的服务器可以根据该模板动态创建优化的、特定于设备的包。
与可立即安装的 APK 不同,AAB 文件不能直接安装在设备上。它是一个上传到 Play 商店的构建工件,Google 的基础设施会对其进行处理并为每个设备配置生成定制的 APK。
文件扩展名为 .aab,内部使用协议缓冲区格式与类似 ZIP 的结构相结合。它包含应用程序的 DEX 字节码、资源、资产、本机库和一个特殊的捆绑元数据文件,该文件告诉 Google Play 如何拆分内容。
为什么 Google 强制要求应用程序捆绑包
App Bundles 背后的主要动机是 减少应用程序下载大小。典型的 Android 应用程序需要支持多种屏幕密度(mdpi、hdpi、xhdpi、xxhdpi、xxxhdpi)、多种 CPU 架构(armeabi-v7a、arm64-v8a、x86、x86_64)和多种语言。在传统的 APK 模型中,所有这些资源都捆绑到一个文件中,即使任何给定设备只需要其中的一小部分。
考虑一个游戏,其中包含适用于四种 CPU 架构的本机库和适用于五种屏幕密度的纹理。通用 APK 可能为 200 MB,但仅包含相关架构和密度的设备特定版本可能为 80 MB。下载大小减少了 60%。
Google 报告称,使用 App Bundle 的应用程序平均比通用 APK 等效项小 15%。对于大型应用程序和游戏,节省的费用可能要大得多。较小的下载意味着更快的安装、更少的带宽消耗以及更少的由于大小问题而放弃的安装。
应用程序包内部如何工作
束结构
AAB 文件被组织成模块,每个模块都包含自己的代码、资源和资产。最常见的结构包括:
- 基础模块: 包含每个设备所需的核心应用程序代码和资源。这始终是安装的。
- 配置拆分: 语言资源、屏幕密度资源和 ABI(CPU 架构)本机库的单独部分。
- 动态功能模块: 初始安装后可按需下载的可选模块。
- 资源包: 游戏关卡或媒体等大型资产可以在安装时、按需或在后台交付。
拆分 APK 生成
当用户从 Play 商店下载应用程序时,Google 的服务器会检查设备的配置并生成一组针对该特定设备定制的拆分 APK。典型的安装可能包括:
- base.apk,核心应用代码和必备资源
- split_config.arm64_v8a.apk,设备 CPU 的本机库
- split_config.xxhdpi.apk,设备屏幕密度的资源
- split_config.en.apk,用户区域设置的语言资源
这些拆分的 APK 作为单个逻辑应用程序安装在一起。 Android 包管理器将它们视为一个应用程序,但它们在设备上是物理上独立的文件。这是可以节省大小的机制。
动态交付
App Bundles 最强大的功能之一是动态交付。开发人员可以将某些功能标记为可按需下载。例如,照片编辑应用程序可能包含高级滤镜作为动态功能模块。从未使用过这些过滤器的用户永远不会下载它们,从而节省了存储空间。
动态功能模块在运行时通过 Play Core 库下载并安装。该应用程序可以检查模块是否已安装,并在需要时请求下载,因此用户可以通过小型应用程序内下载来体验新功能,而不是完全重新安装。
AAB 与 APK:主要区别
了解这些格式之间的差异有助于阐明每种格式何时适用:
- 可安装性: APK文件可以直接安装在任何Android设备上。 AAB 文件无法直接安装,必须先进行处理。
- 尺寸: 通用 APK 包含所有配置的资源。 AAB 支持特定于设备的交付,从而减少下载量。
- 签约: 通过 APK,开发人员签署最终的可安装包。通过 AAB,开发人员对捆绑包进行签名,Google 使用 Play 应用签名对生成的 APK 进行重新签名。
- 分配: APK 可以通过任何渠道分发。 AAB 主要是为 Play 商店设计的,尽管像 bundletool 这样的工具可以在本地从它们生成 APK。
- 分享性: 您可以轻松地与其他人共享 APK 文件。共享从 AAB 安装的应用程序需要收集所有拆分的 APK,这更加复杂。
签约争议
AAB 授权中争议最多的方面之一是 播放应用程序签名。当开发者上传 AAB 时,Google 持有用于签署交付给用户的最终 APK 的签名密钥。这意味着 Google 在技术上有能力在签名和交付 APK 内容之前对其进行修改。
谷歌认为这是必要的,因为他们需要签署他们生成的拆分 APK。开发人员保留上传密钥来验证其上传内容,但实际的应用签名密钥由 Google 的基础设施管理。
对于大多数开发人员来说,这是一个合理的权衡。 Google 提供密钥备份和恢复服务,并且消除了密钥丢失的风险(这将永久阻止应用程序更新)。然而,注重隐私的开发人员和开源倡导者对这种信任的集中化表示担忧。
这对于共享应用程序的用户意味着什么
向 App Bundle 的转变对于想要在 Play 商店之外共享应用程序的用户具有重大影响:
提取已安装的应用程序
当您提取从 AAB 安装的应用程序时,您不会获得单个 APK 文件。相反,您会获得拆分 APK 的集合。这些分割是特定于设备的,这意味着从具有 ARM64 处理器和 xxhdpi 屏幕的手机中提取的应用程序将无法在具有不同配置的设备上运行。
XAPK 和 APKS 格式
为了解决共享拆分 APK 的挑战,创建了 XAPK 和 APKS 等容器格式。这些格式将所有拆分的 APK 捆绑在一起形成一个可下载文件。当您遇到 XAPK 文件时,它可能包含最初作为应用程序包分发的应用程序。
我们的 XAPKS 到 APK 转换器 可以帮助您从这些容器格式中提取基础 APK。但是,请记住,基础 APK 本身可能不包含应用程序在每个设备上正常运行所需的所有资源,因为密度和 ABI 特定资源可能位于拆分 APK 中。
使用捆绑工具
Google 提供了一个名为 bundletool 的开源工具,可以在本地从 AAB 文件生成 APK。开发人员可以使用它来创建通用 APK 以进行测试或替代分发。该命令如下所示:
bundletool build-apks --bundle=app.aab --output=app.apks --mode=universal
这会生成一个通用 APK,其中包含所有配置的所有资源。它将比特定于设备的版本更大,但适用于任何设备。这是我们的AAB 到 APK 转换器使用的方法。
对替代应用商店的影响
AAB 指令主要影响 Google Play 商店。替代应用商店和直接分发渠道仍然可以接受 APK 文件。想要在 Play 之外分发的开发者可以在上传 AAB 的同时继续构建通用 APK。
然而,一些开发者只构建 AAB,并完全依赖 Play 进行分发。这意味着这些开发者的应用程序更难在 Play 商店生态系统之外获得。第三方应用程序存储库已通过托管拆分 APK 集合(作为 XAPK 或 APKS 文件)或使用 bundletool 生成通用 APK 进行了调整。
动态特征模块的实践
动态功能模块代表了 App Bundle 格式最有趣的功能之一。以下是一些现实世界的用例:
- 相机特点: 应用程序可能包含 AR 滤镜作为动态模块,仅在用户首次访问相机功能时下载。
- 语言包: 不太常见语言的翻译数据可以按需提供,而不是与每次安装捆绑在一起。
- 游戏关卡: Games 可以随着玩家的进步提供额外的内容,从而保持初始下载量较小。
- 专业工具: 生产力应用程序中的高级功能只能提供给需要的用户。
对于用户来说,这意味着随着动态模块的下载,应用程序的安装大小可能会随着时间的推移而增加。这还意味着共享此类应用程序需要包含所有下载的模块,从而使提取过程进一步复杂化。
开发人员最佳实践
如果您正在开发 Android 应用程序,以下是有效使用应用程序包的建议:
- 始终在本地使用bundletool进行测试 上传到 Play 之前。生成特定于设备的 APK 并验证它们是否正常工作。
- 使用 Play 管理中心的内部测试轨道 用于验证拆分 APK 是否在真实设备上安装并正常运行。
- 如果您的用户群超出了 Play 商店,则 考虑提供通用 APK 适用于替代分销渠道。
- 请注意动态功能模块边界。 经常使用的功能应该位于基本模块中,而不是动态模块中。
- 在不同配置的设备上进行测试,确保正确生成配置拆分并且不丢失任何资源。
- 确保您的上传密钥安全。 虽然 Google 管理应用签名密钥,但您的上传密钥会验证您作为开发者的身份。
应用程序分发的未来
App Bundle 格式不断发展。 Google 推出了针对大型游戏资产的 Play Asset Delivery、针对广告 SDK 的 SDK Runtime 等功能,以及改进了对 Wear OS 和 Android TV 配置的支持。趋势是更精细、按需交付应用程序组件。
对于用户来说,这意味着单一、独立的应用程序文件的概念对于 Play 商店应用程序来说越来越不常见。对于在标准 Play 商店流程之外管理应用程序的任何人来说,了解 XAPK、APKS 等格式以及可用于使用它们的工具变得越来越重要。
何时保留 AAB 与何时构建通用 APK
Android App Bundle 代表了应用程序打包和交付方式的根本转变。虽然它在下载大小和交付效率方面带来了真正的好处,但它也给共享应用程序或从其他来源安装应用程序的用户带来了复杂性。了解 AAB 的工作原理、它们如何生成拆分 APK 以及可用于在格式之间进行转换的工具,可以帮助您自信地选择正确的格式并在它们之间进行转换。
开发人员寻求 AAB 来优化应用程序的交付方式;大多数日常用户只有在尝试在无法访问 Play 商店的设备上安装某些内容时才会遇到这种情况。不管怎样,值得记住的事情很简单:AAB 是一种发布格式,而不是安装格式,并且有一些工具可以弥补两者之间的差距。