2、Android App Bundle基础介绍:什么是AAB、它的组成结构与如何生成

好,咱们正式开始聊 App Bundle。说实话,第一次接触这东西的时候,我内心是抗拒的。你想啊,APK 用了这么多年,突然要换个新格式,谁不嘀咕?但真正上手之后,我只能说——真香。

现在很多团队还在纠结要不要切 AAB,我的建议是:别犹豫了,尤其是要做灰度发布的团队。为什么?因为 AAB 天生就是为动态分发设计的。下面我带你从头捋一遍。

Android App Bundle 核心知识体系 App Bundle (.aab) base 模块(基础) feature 模块(功能) asset 模块(资源) 代码 & 资源 清单文件 动态功能模块 按需分发 大型资源包 游戏资源 如何生成 AAB Android Studio 构建 命令行 bundletool CI/CD 自动化 💡 核心思想:AAB 是“发布格式”,APK 是“安装格式”;Google Play 负责转换和分发

2.1 到底什么是 App Bundle?

App Bundle,后缀是 .aab,不是 APK。它不是最终安装包,而是 Google Play 用来生成优化 APK 的“中间产物”。说白了,你把 AAB 上传到 Play Console,Google 服务器会根据用户的设备配置(屏幕密度、CPU 架构、语言等)动态生成最合适的 APK。

关键区别:

  • APK:最终安装文件,包含所有资源。
  • AAB:发布文件,只包含原始代码和资源,不包含为各设备优化的副本。

我一开始也觉得这不就是换了个壳吗?直到我看见一个 100MB 的 APK 在 AAB 模式下变成 30MB 的下载包,客户体验直接拉满。灰度发布时,包体越小,用户下载意愿越高,这是铁律。

2.2 AAB 的组成结构

AAB 本质上是一个 ZIP 包(你可以直接解压看看),里面分三个模块:base、feature 和 asset。理解这三个东西,你就掌握了 AAB 的精髓。

模块 作用 是否必须 典型场景
base 应用的核心功能和基础资源 必须 启动页、主界面、核心逻辑
feature 按需加载的功能模块 可选 拍照功能、AR 模块、付费插件
asset 大型资源文件包 可选 游戏贴图、高清视频、离线地图

base 模块

这是 AAB 的基石。任何设备必须安装 base,否则应用跑不起来。你在 build.gradle 里写的所有代码、资源、配置,默认都进 base。灰度发布时,你改动的基础逻辑必须放在这里,但要注意:base 越小,用户首次下载越快。

feature 模块

这个就灵活了。你可以把一些非核心功能塞进 feature 模块,用户用到时才下载。我在项目里就处理过这种情况:一个拍照增强功能,只有 30% 的用户会使用。于是把它做成 feature 模块,灰度期间只向白名单用户下发——完美控制流量。

我的经验:灰度发布时,把实验性功能放在 feature 模块里,可以做到按用户维度动态下发,而不用发新版。配合 Play Feature Delivery API,体验非常顺滑。

asset 模块

专门存放大型资源。比如游戏厂商会把高清贴图放在 asset 模块里,用户安装基础包后,可在 Wi-Fi 环境下手动下载这些资源。不占初始安装包大小,也不影响首次进入体验。

2.3 如何生成 AAB?

生成 AAB 不难,难的是正确配置。我见过很多人直接把 APK 打包方式改个后缀就完事——这肯定不行。下面说两种常用方式。

方式一:Android Studio 直接构建

从 Build 菜单选择 Build Bundle(s) / APK(s) → Build Bundle(s)。Gradle 会自动执行 bundleRelease。最终产物在 app/build/outputs/bundle/release/ 目录下。

嗯,这里要注意一点:默认生成的 AAB 是未签名的。上传到 Play Console 之前必须签名。你可以让 Gradle 自动签名,也可以在构建后通过 jarsigner 手动签。

方式二:命令行 + bundletool

这是 CI/CD 场景下的首选。先确保安装了 bundletool,然后执行:

// 构建 AAB
./gradlew bundleRelease

// 使用 bundletool 生成 APK(用于本地测试)
java -jar bundletool.jar build-apks \
  --bundle=app/build/outputs/bundle/release/app-release.aab \
  --output=app.apks \
  --ks=my-release-key.jks \
  --ks-pass=pass:your_password \
  --ks-key-alias=your_alias \
  --key-pass=pass:your_password

为什么要用 bundletool 生成 APK?我问你:你在灰度发布前需要测试吧?AAB 不能直接安装到手机上。通过 bundletool 生成的 APK 集合,你可以指定设备类型、分辨率、语言,模拟真实分发场景。

我曾经踩过的坑:本地测试时直接拿 bundletool 生成的通用 APK 安装,结果上了灰度发现部分机型的资源加载失败。后来才发现——测试时必须指定设备规格(通过 --connected-device 参数),否则 bundletool 默认生成的是“万能版”,起不到验证效果。

Gradle 配置要点

在 app/build.gradle 里,你需要启用 AAB 支持并配置签名。这里给个最小模板:

android {
    // ...
    bundle {
        language {
            enableSplit = true
        }
        density {
            enableSplit = true
        }
        abi {
            enableSplit = true
        }
    }
    signingConfigs {
        release {
            storeFile file("my-release-key.jks")
            storePassword "your_store_password"
            keyAlias "your_key_alias"
            keyPassword "your_key_password"
        }
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
    }
}

关于 bundle 里的三项配置,说白了就是决定要不要为不同语言、屏幕密度、CPU 架构生成独立 APK。我都建议设为 true,这是 AAB 的优势所在。灰度发布时,你只需控制单一 AAB 文件的上传,Play Store 会自动处理后续分发。

2.4 小结

App Bundle 不是替换 APK,而是替换你的发布流程。记住三个模块的职责:base 是根、feature 是枝干、asset 是果实。生成 AAB 很简单,但测试和灰度策略才是重头戏。后面我会详细讲怎么用 feature 模块做精细化的灰度控制——不过那是后话了。