关于 Google Play 安装包:你需要知道的一切
对于大多数 Android 用户来说,Google Play 商店是获取应用程序和游戏的主要渠道。但你是否曾好奇,当你点击“安装”按钮后,背后发生了什么?应用程序是如何被打包、分发并最终出现在你的手机上的?
这篇文章将深入探讨 Google Play 安装包的世界,从传统的 APK 到现代的 App Bundle,为你揭开其神秘面纱。
1. 核心概念:从 APK 到 AAB
APK (Android Package Kit)
多年来,APK 一直是 Android 应用程序分发的标准格式。它像一个“万能包”,包含了应用程序运行所需的一切:代码、资源(图片、音频)、资产、证书和清单文件。开发者将应用打包成一个单一的 .apk 文件,上传到 Google Play,用户下载的也是这个完整的文件。
APK 的问题:
- 体积臃肿: 一个 APK 必须包含适用于所有不同设备(不同屏幕密度、不同 CPU 架构)的资源。这意味着即使用户的手机是
arm64架构、xxhdpi的屏幕,他们下载的 APK 中也包含了x86架构、mdpi、hdpi等用不上的文件,造成了空间和流量的浪费。 - 管理复杂: 为了优化用户体验,开发者有时需要为不同的设备特性手动构建和管理多个版本的 APK(例如,一个针对 ARM 架构,一个针对 x86 架构),这大大增加了维护成本。
AAB (Android App Bundle)
为了解决 APK 的痛点,Google 在 2018 年推出了 Android App Bundle (.aab),这是一种更现代、更高效的发布格式。
与 APK 不同,AAB 并不是一个可以直接安装的文件。相反,它是一个包含了应用所有编译代码和资源的“素材包”。开发者将 AAB 上传到 Google Play,然后由 Google Play 接管后续的打包和分发工作。这个过程被称为 “动态分发” (Dynamic Delivery)。
AAB 的优势:
- 更小的应用体积: Google Play 会根据每个用户的设备配置(如屏幕密度、CPU 架构、语言),从 AAB 中动态生成并仅提供该设备所需的 APK 文件。这大大减小了用户下载和更新应用时的体积,平均可节省 20% 以上。
- 简化的发布流程: 开发者不再需要构建和管理多个 APK,只需上传一个 AAB 文件即可覆盖所有设备类型。
- 动态功能模块 (Dynamic Feature Modules): 允许将应用的某些功能或内容打包成独立的模块,仅在用户需要时才下载安装,而不是在初始安装时就全部下载。例如,一个视频编辑应用可以将“高级滤镜”作为一个动态功能,只有当用户付费或选择使用时才下载。
- 资产包 (Asset Packs): 主要用于游戏。可以将大型游戏资产(如纹理、地图)打包成资产包,根据设备性能和用户进度按需交付。
自 2021 年 8 月起,Google Play 已要求所有新应用必须使用 AAB 格式发布。
2. AAB 的内部结构
一个 .aab 文件本身是一个 ZIP 压缩包,其内部结构通常如下:
base/: 基础模块,包含了所有应用共享的核心代码和资源。无论用户设备如何,这部分总是会被安装。feature_name/: 动态功能模块。每个功能模块都有自己的代码和资源。asset_pack_name/: 资产包。BUNDLE-METADATA/: 包含元数据文件,例如 ProGuard 的映射文件和应用的依赖信息。
在 base 模块和功能模块内部,资源被按照设备配置进行了拆分,例如:
- 语言拆分 (Language Splits):
res/values-en/,res/values-fr/ - 屏幕密度拆分 (Screen Density Splits):
res/drawable-mdpi/,res/drawable-xxhdpi/ - ABI 拆分 (CPU Architecture Splits):
lib/arm64-v8a/,lib/x86_64/
当用户请求安装应用时,Google Play 会根据其设备信息(例如,语言设置为“英语”,屏幕为 xxhdpi,CPU 为 arm64-v8a),将 base 模块与对应的 -en、-xxhdpi 和 arm64-v8a 相关的资源和库文件组合在一起,生成一个高度优化的 APK。
3. 如何构建和测试 AAB
对于开发者而言,从构建 APK 切换到构建 AAB 非常简单。
使用 Android Studio 构建 AAB
- 打开你的 Android 项目。
- 在菜单栏中,选择
Build->Generate Signed Bundle / APK...。 - 在弹出的对话框中,选择
Android App Bundle,然后点击Next。 - 选择或创建一个签名密钥(与为 APK 签名的方式相同),填写相关信息,然后点击
Next。 - 选择构建变体(例如
release),然后点击Finish。
Android Studio 将在你的项目 build/outputs/bundle/release/ 目录下生成一个 .aab 文件。
测试 AAB
由于 .aab 文件不能直接安装,你需要专门的工具来测试它。
- Google Play 内部测试轨道: 最推荐的方式。将 AAB 上传到 Google Play Console 的“内部测试”或“封闭式测试”轨道,然后通过邀请测试人员从 Play 商店下载。这能最真实地模拟最终用户的安装体验。
bundletool: 一个由 Google 提供的命令行工具,可以让你在本地从 AAB 生成 APKs 并将其部署到连接的设备上。这对于快速验证应用功能非常有用。
4. 安全性:Google Play Protect
无论是 APK 还是 AAB,安全性都是重中之重。Google Play 内置了名为 Google Play Protect 的安全服务,它扮演着应用生态系统“守护者”的角色。
- 上架前扫描: 当开发者上传应用时,Play Protect 会对其进行严格的扫描,以检测已知的恶意软件、病毒和有害行为。
- 持续扫描: 它还会定期扫描用户设备上已安装的应用,确保它们没有在更新后“变坏”。
- 机器学习: Play Protect 利用机器学习技术来识别新的和未知的威胁。
此外,Google Play 的“数据安全”部分要求开发者明确声明其应用如何收集和处理用户数据,为用户提供了更高的透明度。
5. 关于“侧载”(Sideloading)
侧载指的是从 Google Play 商店以外的来源(例如,网站、第三方应用市场)下载并安装 APK 文件的行为。Android 系统允许侧载,但默认情况下是禁用的,需要用户手动开启“安装未知应用”的权限。
风险与挑战:
- 安全风险: 侧载的主要风险在于应用来源不可信。这些 APK 可能被篡改,植入了恶意软件或广告插件,对你的设备和数据安全构成威胁。
- 不兼容和缺失功能: 如果一个应用是为 AAB 设计的,你从别处获取的 APK 可能是所谓的“拆分 APK”(Split APKs) 的一部分。如果你只安装了基础包 (
base.apk),而没有安装针对你设备屏幕密度和 CPU 架构的配置包 (config.xxhdpi.apk,config.arm64_v8a.apk),应用可能会崩溃或显示不正常。
因此,除非你完全信任来源,并且了解其风险,否则强烈建议始终通过 Google Play 商店获取应用。
结论
Google Play 的安装包技术已经从简单的 APK 演变为复杂的、由云端驱动的 AAB 动态分发系统。这一转变的核心目标是为用户提供更小、更快、更安全的下载体验,同时也为开发者简化了发布流程。
下次当你在 Google Play 上点击“更新”并看到下载体积远小于应用总大小时,你就会明白,这正是 Android App Bundle 和动态分发在背后为你节省流量和时间的体现。