什么是 Android App Bundle?为什么需要它?

我先问你一个问题:你平时打包上传 Google Play 时,是不是还在用 APK?

说实话,几年前我也是这样。直到有一次我维护一个大型项目,APK 体积飙到 80MB 以上,用户下载转化率直接掉了一截。老板拍桌子问怎么回事,我才开始认真研究 App Bundle。

传统 APK 的痛点

传统 APK 是一个「全量包」。不管用户手机是 x86 还是 ARM,屏幕是 320dpi 还是 640dpi,语言是中文还是阿拉伯语,你的 APK 里所有资源全都塞进去了。

你想想看,一个 60MB 的 APK,可能用户真正用到的只有 30MB。剩下的一半——嗯,都是白浪费的流量和存储空间。

  • 体积冗余:多套资源、多套 so 库,全部打包
  • 功能强制捆绑:新增功能无法按需加载,只能随主包一起发布
  • 更新成本高:每次修改哪怕一行代码,用户都得重新下载整个 APK

我曾经踩过的坑:有一次为了赶上线,我把一块实验性功能直接塞进了 APK 主包。结果用户反馈说根本用不到这个功能,但每次更新都要多下载 8MB。后来产品经理追着骂了一个星期……从那以后,我开始认真思考模块化动态交付的方案。

App Bundle 究竟是什么?

用一句话说:App Bundle (.aab) 只是一个「发行格式」,不是安装格式。

它把 APK 拆成了多个独立的部分——基础模块、动态特性模块、资源包。当你上传 .aab 到 Google Play 后,Play 商店会根据用户设备配置(屏幕密度、CPU 架构、语言)动态生成一个「恰好够用」的 APK。

核心理解:你不再需要自己手动打多版本 APK,也不用为不同屏幕尺寸准备不同的包。Google Play 帮你自动化做了这件事。

为什么我们需要它?

原因很直接:体积、速度、灵活性。

对比项 传统 APK App Bundle
包体积 全量,通常 50-150MB 按需生成,平均减少 30-50%
动态功能 全部内置,无法按需加载 支持按需下载、条件性交付
更新效率 全量下载 仅更新变化的模块(增量)
多配置管理 需要手动打多个 APK Play 商店自动分发对应版本

我个人习惯把 App Bundle 比喻成「乐高盒子」。你给 Play 商店的是全套积木(.aab),商店根据每个买家的需求,拼出最合适的成品(APK)。用户只需要下载自己需要的那部分。

动态模块交付:这才是 App Bundle 的杀手锏

除了体积优化,App Bundle 还引入了「动态功能模块」(Dynamic Feature Module)。你可以把非核心功能——比如广告 SDK、高级滤镜、AI 离线模型、甚至某个独立页面——做成一个单独的模块。

这些模块可以:

  • 按需下载:用户点击时才下载,用完可卸载
  • 条件性交付:只在特定国家/地区、特定 API 级别、特定设备特性下展示
  • 免安装体验:部分模块甚至支持 Google Play Instant,不安装直接运行

避坑指南:动态模块不是免费的。它需要你付出额外的工作——模块间的依赖管理、资源拆分、清单合并……但如果你做的是大型应用(500MB 以上),这一点付出值得。我记得有篇文章说,Google、Netflix、Uber 都在用,不是没理由的。

技术原理速览:.aab 与 APK 的转换

// .aab 文件结构(解压后大致如此)
base/
  manifest/
  dex/
  res/
  lib/       (所有架构的 so)
  assets/
  ...
feature_camera/
  manifest/
  dex/
  res/
  ...
BundleConfig.pb  // 配置信息

.aab 不会直接运行在手机上。它必须经过「bundletool」或 Play 商店的签名服务,生成一系列针对不同设备配置的 APK(称为 APK Set)。

实际落地效果怎么样?

我在一个日活 500w 的海外电商 App 上实践过。接入 App Bundle 后,基础包体积从 72MB 降到了 35MB 左右(仅计算基础模块)。用户下载转化率提升了 4.5%。更爽的是,我们后来加了一个「AR 试鞋」的动态模块,只在支持 ARCore 的设备上可见,代码完全解耦,不影响主模块维护。

一句话总结:App Bundle 不是让你多写代码,而是让你更聪明地打包和分发。它解决的是「所有设备吃同一个包」这个历史遗留问题。

下图是我工作中常用的一张流程图,帮你建立整体认知:

App Bundle 核心交付流程 传统方式 全量 APK,体积大 无动态功能 App Bundle (.aab) 发行包 基础模块 动态特性模块 资源包 Google Play 按需组合 按需分发 APK(每个设备定制) 最终用户只下载 自己所需的资源

这张图很清楚地展示了一件事:.aab 是源头,Play 商店是加工厂,每个用户拿到的是唯一定制的 APK。这个过程完全自动化,你只需要在打包时把模块拆好。嗯,说到这里你可能已经跃跃欲试了——别急,后面几章我会带你从零搭建一个动态模块项目,包括那些我实战中趟过的坑。