17、应用签名与发布:签名配置、APK构建、AAB格式、Google Play Console发布流程

说实话,很多开发者写代码时行云流水,一到发布环节就手忙脚乱。我见过不少同事,在最后一步因为签名搞错、密钥丢失,折腾一整天。今天咱们就把这块彻底捋清楚。

应用签名与发布核心流程 签名配置 密钥库生成 签名算法选择 APK构建 AAB格式 Google Play Console 发布 从签名到上架,环环相扣,一步都不能错

17.1 签名配置——你的应用身份证

签名是什么?说白了就是给应用盖个章。Android系统通过签名来识别应用的作者身份。同一个包名,如果签名不一致,系统会认为这是两个不同的应用,直接拒绝覆盖安装。

我在项目中遇到过最惨的一次:同事把debug签名当release签名上传到商店,结果用户反馈无法更新。嗯,从那以后我养成了一个习惯——每次构建前先检查签名配置。

密钥库生成

用Android Studio生成密钥库很简单,但我个人习惯用命令行,更可控:

keytool -genkey -v -keystore my-release-key.jks \
  -keyalg RSA -keysize 2048 -validity 10000 \
  -alias my-alias

这里有几个参数要注意:

  • -validity:有效期,单位是天。10000天大约是27年,够用了
  • -keysize:2048位是当前推荐值,别用1024了,不安全
  • -keyalg:RSA是目前最通用的算法
⚠️ 密钥库丢了,应用就废了
我曾经见过一个团队,密钥库存在某位离职同事的电脑里,人走了密钥也找不到了。后来那个应用只能改名重新上架。密钥库一定要备份,多存几个地方。

Gradle签名配置

在模块级的build.gradle里配置签名,我一般这样写:

android {
    signingConfigs {
        release {
            storeFile file("my-release-key.jks")
            storePassword "your-store-password"
            keyAlias "my-alias"
            keyPassword "your-key-password"
        }
    }
    buildTypes {
        release {
            signingConfig signingConfigs.release
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}
💡 密码别硬编码
上面的写法只是为了演示。实际项目中,密码应该从环境变量或gradle.properties中读取。我习惯在gradle.properties里写:
RELEASE_STORE_PASSWORD=xxx
然后在build.gradle里用System.getenv("RELEASE_STORE_PASSWORD")读取。

17.2 APK构建——传统但依然重要

APK是Android应用的传统打包格式。虽然Google现在主推AAB,但APK在测试和内部分发时仍然不可或缺。

构建APK有两种方式:

  1. Android Studio直接构建:Build → Build Bundle(s) / APK(s) → Build APK(s)
  2. 命令行构建./gradlew assembleRelease

我个人更推荐命令行方式。为什么?因为可以集成到CI/CD流水线里,实现自动化构建。你想想看,每次手动点来点去,多容易出错。

构建完成后,APK文件在 app/build/outputs/apk/release/ 目录下。记得用 jarsignerapksigner 验证签名:

apksigner verify --verbose app-release.apk

输出应该显示 Verified using v1 and v2 schemes。如果只有v1,说明签名方案太老了。

签名方案版本
Android 7.0(API 24)开始支持v2签名方案,Android 9.0(API 28)开始支持v3签名方案。建议同时启用v1和v2,确保兼容性。

17.3 AAB格式——Google Play的新标准

Android App Bundle(AAB)是Google在2018年推出的新格式。它不是一个安装包,而是一个包含所有资源的"母包"。Google Play会根据用户的设备配置,从AAB中提取出最适合的APK。

说白了,AAB的好处就是:

  • 应用体积更小:用户只下载需要的资源,平均减少15%的体积
  • 动态分发:可以按需下载功能模块
  • Play Feature Delivery:条件性分发,比如只在特定国家显示某个功能

构建AAB的命令也很简单:

./gradlew bundleRelease

生成的AAB文件在 app/build/outputs/bundle/release/ 目录下。

⚠️ AAB不能直接安装
AAB文件不能通过adb install安装到设备上。你需要用 bundletool 工具将其转换为APK才能测试。我习惯在CI流程中加一步:
java -jar bundletool.jar build-apks --bundle=app.aab --output=app.apks

17.4 Google Play Console发布流程

终于到了上架这一步。Google Play Console的界面经常更新,但核心流程没变过。

第一步:创建应用

登录Google Play Console,点击"创建应用"。填写应用名称、默认语言、应用类型(应用/游戏)和是否付费。

第二步:填写商店信息

这里需要准备:

  • 应用简介(80字以内)和完整描述(4000字以内)
  • 截图(至少2张,推荐6-8张)
  • 图标(512x512,32位PNG)
  • 特色图(1024x500)

我记得有一次,因为截图尺寸不对,被审核打回来三次。后来我写了个脚本自动裁剪截图,再也没出过问题。

第三步:上传AAB

在"发布" → "内部测试"或"正式版"中上传AAB文件。上传后,Google Play会自动检查签名和兼容性。

第四步:填写版本信息

版本号、版本名称、更新说明。更新说明建议写清楚:

  • 新增了什么功能
  • 修复了什么bug
  • 有没有需要用户注意的变更

第五步:审核与发布

提交审核后,通常几小时到几天不等。审核通过后,你可以选择手动发布或定时发布。

💡 分阶段发布
我建议新版本先发布到5%的用户,观察几天。如果没有严重问题,再逐步扩大到100%。这样即使有bug,影响面也小。

17.5 签名密钥管理——血的教训

最后,我想聊聊密钥管理。这可能是整个发布流程中最容易被忽视,但后果最严重的一环。

我曾经接手过一个项目,前任开发者把密钥库放在项目的根目录下,还提交到了Git仓库。虽然仓库是私有的,但想想都后怕。密钥库一旦泄露,别人就可以用你的签名发布恶意应用。

我的建议是:

  • 密钥库文件不要放在项目目录中
  • 使用独立的密码管理工具(如1Password、KeePass)存储密码
  • 至少备份到两个不同的物理位置
  • 考虑使用Google Play App Signing,把密钥交给Google保管

Google Play App Signing是个好东西。你上传一个上传密钥,Google用你的应用签名密钥重新签名。这样即使上传密钥丢了,也能找Google恢复。我现在的项目都这么配置,省心不少。

好了,签名与发布这块就聊到这儿。记住一句话:签名是应用的身份证,丢了就没了。做好备份,规范流程,发布才能顺顺利利。


公众号:蓝海资料掘金营,微信deep3321