3、构建可发布的APK/AAB:Android App Bundle (AAB) 介绍、使用Android Studio生成签名AAB、多维度构建配置

好,咱们进入第三章。这一章聊的是打包发布前的最后一步——构建可发布的产物。说白了,就是把你写的代码变成能上架Google Play的安装包。

我记得刚入行那会儿,大家还都在用APK。后来Google推了AAB,我一开始还挺抗拒的,觉得多此一举。直到有一次我负责的一个应用包体超过了150MB,APK上传直接被Google Play拒了……嗯,从那以后我就老老实实研究AAB了。

3.1 Android App Bundle (AAB) 介绍

AAB,全称Android App Bundle,是Google在2018年推出的官方发布格式。它和APK最大的区别是什么?

APK是一个“一刀切”的包——里面包含了所有设备的资源、代码、库。不管你的手机是x86还是ARM,是中文还是英文,APK里全都有。而AAB呢?它更像是一个“原材料包”,你把它上传到Google Play,Play会根据用户的设备配置,动态生成最合适的APK。

举个例子:

  • 你的应用支持中文和英文。AAB里两种语言资源都有。
  • 用户A的手机是中文系统,Google Play只把中文资源打包进APK给他。
  • 用户B是英文系统,那就只给英文资源。

这样做的好处很明显——用户下载的APK更小,安装更快。我在项目中实测过,一个原本80MB的APK,通过AAB分发后,用户实际下载的包体只有40MB左右。省了一半流量,用户留存率都高了一些。

核心要点:从2021年8月起,Google Play要求所有新应用必须使用AAB格式发布。APK只能用于内部测试或侧载安装。

3.2 使用Android Studio生成签名AAB

生成签名AAB,说白了就是给你的安装包打上“身份证”。没有签名的包,Google Play是不认的。

我个人习惯用Android Studio的图形界面来做,因为直观、不容易出错。步骤如下:

  1. 在Android Studio中,点击菜单栏 Build → Generate Signed Bundle / APK
  2. 弹窗里选择 Android App Bundle,然后点Next。
  3. 这里会让你选择签名文件。如果你之前没有创建过,点 Create new 新建一个。
  4. 填写签名信息:Key store path(存储路径)、Password(密码)、Key alias(别名)、Key password(密钥密码)。
  5. 填写证书信息:至少填一个,比如你的名字或公司名。
  6. 选好签名文件后,点Next,选择 release 构建变体。
  7. 勾选 Signature Versions:建议两个都勾上(V1和V2)。V1是旧版签名,V2是新版,兼容性更好。
  8. 点Finish,等几秒钟,你的.aab文件就生成好了。

小提示:签名文件一定要备份好!我曾经有个同事把签名文件弄丢了,结果应用更新时只能换签名,导致用户需要卸载旧版再安装新版,流失了一大波用户。建议把.jks文件放到Git仓库的私有分支里,或者用密码管理器保存。

如果你喜欢命令行,也可以用 gradle 任务来生成:

./gradlew bundleRelease

这个命令会在 app/build/outputs/bundle/release/ 目录下生成 app-release.aab 文件。前提是你已经在 build.gradle 里配置好了签名信息。

3.3 多维度构建配置

多维度构建配置,说白了就是让你能“一套代码,打出不同版本的包”。比如:

  • 免费版 vs 付费版
  • 国内版 vs 海外版
  • 开发环境 vs 生产环境

Android Studio通过 Build Variants 来实现这个功能。它由两个维度组成:Build TypeProduct Flavor

3.4 Build Type(构建类型)

默认情况下,Android项目有两个Build Type:

  • debug:用于开发调试,默认不签名,可调试。
  • release:用于发布,需要签名,不可调试。

你可以自定义更多,比如:

android {
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        debug {
            applicationIdSuffix ".debug"
            versionNameSuffix "-debug"
        }
        staging {
            initWith debug
            applicationIdSuffix ".staging"
            versionNameSuffix "-staging"
        }
    }
}

这里我加了一个 staging 类型,用于预发布环境。注意 initWith debug 表示继承debug的配置,然后覆盖部分属性。

3.5 Product Flavor(产品风味)

Product Flavor 用来区分不同版本的应用。比如免费版和付费版:

android {
    flavorDimensions "version"
    productFlavors {
        free {
            dimension "version"
            applicationId "com.example.app.free"
            versionName "1.0-free"
        }
        paid {
            dimension "version"
            applicationId "com.example.app.paid"
            versionName "1.0-paid"
        }
    }
}

配置好之后,Android Studio的Build Variants面板里就会出现 freeDebugfreeReleasepaidDebugpaidRelease 四个变体。你可以根据需要选择打包哪个。

注意:Product Flavor 和 Build Type 是组合关系,不是覆盖关系。比如 freerelease 组合成 freeRelease。如果某个配置在两个维度里都有定义,Build Type 的优先级更高。

3.6 多维度组合的实际应用

我在项目中遇到过这样一个场景:需要同时区分“免费版/付费版”和“国内版/海外版”。这时候就需要两个维度:

android {
    flavorDimensions "version", "region"
    productFlavors {
        free {
            dimension "version"
        }
        paid {
            dimension "version"
        }
        china {
            dimension "region"
        }
        global {
            dimension "region"
        }
    }
}

这样组合出来的变体就有:freeChinaDebugfreeChinaReleasefreeGlobalDebug……一共8个。每个变体可以有自己的资源文件、代码、依赖库。

比如,你可以在 src/freeChina/ 目录下放国内免费版的专属资源,在 src/paidGlobal/ 下放海外付费版的资源。Gradle会自动帮你合并。

总结一下:多维度构建配置的核心就是“一次配置,多包输出”。它让你的发布流程更灵活,也更容易维护。我个人建议,哪怕你的应用现在只有一个版本,也提前把 flavorDimensionsproductFlavors 搭好。因为一旦应用做大了,再回头重构构建配置,那叫一个痛苦。

好了,这一章的内容就到这里。下一章我们会聊如何把AAB上传到Google Play Console,以及那些容易踩的坑。到时候见。