启用App Bundle:在Android Studio中配置项目签名并开启AAB构建
启用App Bundle,说白了就是让Android Studio打AAB格式的包。但有个前提你必须先搞定——签名。Google Play要求所有上传的AAB都得经过签名验证,这跟APK时代一样,只不过AAB的签名机制更严格一些。
我记得刚接触AAB时,有个误区:以为AAB不需要签名,反正Google Play会重新签名。后来发现不是这么回事。你上传的AAB必须用上传密钥签名,Google Play再用分发密钥重新签名,最终分发给用户的APK用的是分发密钥。两个密钥各司其职,缺一不可。
为什么AAB必须签名?
简单来说三点原因:
- 身份验证:证明这个AAB确实是你发布的,不是别人冒名顶替的
- 完整性校验:确保打包后的内容没有被篡改过
- Google Play政策:不上传签名的AAB,后台会直接拒绝,我试过
你可能会问:"那我debug包不签名也能跑啊?" 嗯,debug包用的是Android SDK自带的调试签名,严格来说也算签了名。只不过发布到Google Play必须用你自己生成的release密钥。
第一步:配置签名信息
我个人习惯在项目根目录下放一个 keystore 文件夹,专门存放密钥库文件。当然你也可以放别的位置,关键是要在 build.gradle 里正确引用它。
先创建一个密钥库(如果已经有了可以跳过):
keytool -genkey -v -keystore ./keystore/my-release-key.jks \
-keyalg RSA -keysize 2048 -validity 10000 \
-alias my-key-alias
然后配置 app/build.gradle 的签名信息:
android {
signingConfigs {
release {
storeFile file("./keystore/my-release-key.jks")
storePassword System.getenv("KEYSTORE_PASSWORD") ?: ""
keyAlias "my-key-alias"
keyPassword System.getenv("KEY_PASSWORD") ?: ""
}
}
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),
'proguard-rules.pro'
}
}
}
gradle.properties),并且把属性文件加到 .gitignore 里。密钥库文件也不要提交到Git仓库,否则别人拿到就能冒充你发布应用。
第二步:开启AAB构建
签名配置好了,接下来告诉Android Studio我们要打AAB包。其实不需要改什么特殊开关,只要用 bundle 相关的构建任务就行。
在Android Studio的右侧Gradle面板里,找到 app → Tasks → bundle → bundleRelease,双击就开始构建了。也可以用命令行:
./gradlew bundleRelease
构建完成后,AAB文件会输出在 app/build/outputs/bundle/release/app-release.aab。
如果你用的是Android Studio 3.2及以上版本,直接在菜单栏选 Build → Build Bundle(s) / APK(s) → Build Bundle(s) 也行。我个人习惯用命令行,因为方便集成到CI/CD流水线里。
signingConfig signingConfigs.release 这一行,导致构建出来的AAB没有签名。上传到Google Play后台直接报错 "未签名的Bundle"。排查了半天才发现是release类型的签名配置没关联上。这步很容易忘,一定要检查。
第三步:验证AAB文件
AAB生成后,别急着上传。先验证一下签名是否正确。用 jarsigner 命令:
jarsigner -verify -verbose -certs app-release.aab | grep "X.509"
如果输出里能看到你的证书信息,说明签名成功。如果只看到 jar 已验证 但没有证书细节,大概率用的是debug签名。
另外,你也可以用Google官方的 bundletool 来验证AAB的完整性:
java -jar bundletool-all-x.x.x.jar validate --bundle app-release.aab
这个工具会检查AAB的格式、签名、资源分割等各方面是否正确。我每次发布前都会跑一遍,省得被Google Play驳回重来。
构建类型对比
我把日常开发中几种构建方式整理了一下,方便你对照:
| 构建方式 | 签名类型 | 输出格式 | 主要用途 |
|---|---|---|---|
| debug | SDK调试签名 | APK | 本地开发调试 |
| release (APK) | 手动配置的上传密钥 | APK | 内部分发或测试 |
| release (AAB) | 手动配置的上传密钥 | AAB | 发布到Google Play |
看到区别了吧?debug包自动用调试签名,release包才用你配置的密钥。而且AAB只能通过Google Play分发,不能直接安装到手机上。你想想看,如果想让内部同事测试,还得打一个APK包给他们。
签名版本的新要求
从Android 9(API 28)开始,Google Play要求AAB必须使用 APK Signature Scheme v2(或者更新的v3)。v1签名在AAB里已经不推荐了。你生成密钥库时,keytool 默认创建的是v2兼容的签名,通常没问题。但如果你用的旧版工具或者自定义签名参数,记得加上 -sigalg SHA256withRSA -digestalg SHA-256。
验证签名版本可以用 apksigner 工具:
apksigner verify --verbose app-release.aab
输出会列出所有签名方案。我见过一些同事因为签名版本不对,导致AAB在Google Play后台报 "签名版本过低",结果又重新打包,折腾了半天。
下面这张图梳理了整个流程,从创建密钥库到最终上传,每一步都串起来了。建议你把它保存下来,每次发布前对照着过一遍。
配置签名并开启AAB构建,这一步做扎实了,后面的动态交付才能顺利推进。记住三个关键词:密钥库、signingConfigs、bundleRelease。把这三点盯住了,基本上不会出大问题。
嗯,配置阶段就先聊到这儿。下一步就是真正用AAB来做动态交付了,那才是体现App Bundle真正实力的地方。