什么是 Android App Bundle?

我第一次听到 App Bundle 这个概念时,心里想的是:这不就是又一种打包格式吗?后来深入了解才发现,我错了。它不仅仅是格式变化,更是一种发布理念的升级。

从“胖”APK 到智能分发

说白了,传统 APK 就像一个大礼包。你把所有资源、代码、语言包都塞进去。用户下载时,不管他用什么设备,都得完整下载这个大包。你想想看,这有多浪费?

之前我做的一个应用,光是为了适配不同屏幕密度,就塞了好几套图片资源。用户明明用的是 320dpi 的设备,却得把 xxhdpi 的资源也一起下载下来。安装包硬生生被撑到 60MB。

App Bundle 的核心思路很简单:把决定权交给 Google Play。你只管上传一种发布格式,Google Play 会自动为每台设备生成最合适的 APK。

关键认知: App Bundle 不是一个最终安装文件。它是一种发布格式。就像源代码一样,需要经过处理才能变成可执行文件。

与传统 APK 的核心区别

我习惯用对比表来理解新概念。下面这个表格,基本涵盖了它们的核心差异:

对比维度 传统 APK Android App Bundle
文件格式 .apk(已签名、已对齐) .aab(未签名、未对齐)
分发方式 用户下载完整 APK Google Play 按需组装 APK
资源管理 所有资源打包在一个文件中 资源拆分为多个模块
用户受众 所有用户下载同一版本 每台设备获得定制版
动态加载 需要自行实现功能模块下载 原生支持动态功能模块
构建时间 每次完整构建较慢 增量构建更快

为什么会这样?因为 App Bundle 把 APK 分成了两种角色:基础 APK 和 配置 APK。基础 APK 包含核心代码,用户必须安装。配置 APK 则按需下载,比如针对 mdpi、hdpi、xhdpi 的图片资源,只下发对应部分。

App Bundle 的工作原理

嗯,这里要注意。App Bundle 不是魔法。它背后有一套清晰的流程:

  • 构建阶段: 你用 Android Studio 或命令行打包出 .aab 文件。这个文件包含了所有模块的原始资源。
  • 上传阶段: 把 .aab 上传到 Google Play Console。此时它还没签名,需要 Google Play 帮你完成签名。
  • 分发阶段: 用户点击安装时,Google Play 服务器根据设备信息(屏幕密度、语言、CPU 架构)从 .aab 中提取对应资源,组装成一个精简的 APK。
  • 安装阶段: 用户安装的是这个定制后的 APK,而非原始的 .aab 文件。

我个人觉得,最妙的一点是:你作为开发者,完全不需要关心用户设备的具体参数。一切交给 Play 动态分发。你只管确保 .aab 结构正确即可。

App Bundle 核心概念与分发流程 App Bundle (.aab) 配置 APK 拆分 传统 APK(完整) 动态功能模块 用户设备(按需组装) Google Play 根据设备信息 动态生成最小 APK 动态分发(按需) 传统方式(完整下载)

为什么要迁移到 App Bundle?

说实话,我一开始也犹豫过。毕竟迁移总会带来一些风险。但真正上手后,好处很明显:

  • 应用大小平均减少 20% 以上。 我经历过最夸张的一次,一个 120MB 的 APK 最终降到 45MB。用户下载体验好了不少。
  • 支持动态功能模块。 你想想看,有些功能只有 10% 的用户会用。传统做法要么全部打包,要么自己写一套下载逻辑。App Bundle 直接内置了这套机制。
  • Play 签名更安全。 签名密钥由 Google Play 保管,你不需要再操心密钥泄露问题。
  • 增量构建更快。 每次改完代码,只编译改动部分。开发效率提升明显。
一个小建议: 如果项目正在从零开始,直接用 App Bundle。如果是老项目迁移,建议先从模块化拆分做起,再切换到 .aab 格式。

迁移时要注意什么?

嗯,这里有几个坑,我踩过:

我曾经犯过的错误:
  • 忘记在 Google Play Console 开启 Play App Signing。后果是上传 .aab 总是失败。
  • 使用了一些第三方加固工具,但没检查是否支持 .aab 格式。结果构建通过了,但应用闪退。
  • 动态功能模块的清单文件配置错了依赖关系。用户安装基础 APK 后,功能模块怎么都加载不上。

说白了,App Bundle 是 Google 推动的未来方向。2021 年开始,新应用必须使用 .aab 格式上传。你现在接触它,不是跟风,而是适应必然趋势。

一句话总结: App Bundle 让你只做一次构建,Google Play 帮你做最精细化的分发。用户省流量,你省时间。