从签名好的 AAB 到正式上架 Play 商店。上传本身只需一次点击,真正让首次发布者卡住的是签名密钥的选择、轨道管理、元数据填写以及漫长的审核等待。本教程为零 Android 发布经验的开发者提供完整的通关路径。
Google Play 的上传流程在概念上比 Apple 的更简单,但在实际操作中却更繁琐。说它简单,是因为二进制文件会即时推送给测试人员——没有预配置文件的繁复舞步,没有 entitlements 文件,也没有"开发版"与"发行版"构建之分。说它繁琐,是因为 Google 要求你填写的文件比 Apple 多得多:内容分级问卷、数据安全表单、目标受众声明、广告声明,以及开发者账号的政府 ID 验证。首次发布的大部分时间并不在构建上,而在元数据填写上。
理解整个流程的核心心智模型:你有一个签名密钥,它证明"这次更新来自与上一次相同的发布者"。一旦丢失,你将永远无法更新这个应用。Play 应用签名(Google 自 2017 年起推荐的方案)将其拆分为两个密钥:一个存放在你本机上的上传密钥(如果泄露可以轮换),以及一个由 Google 持有并用于签署实际下发给设备的二进制文件的应用签名密钥。除非有特殊原因,你几乎总应该选择 Play 应用签名。模型的另一半是轨道:内部测试 → 封闭测试 → 开放测试 → 正式发布,覆盖范围依次递增。通常先发布到内部测试轨道(最多 100 名指定测试人员,即时生效),再到封闭测试(私人邀请名单,约一小时生效),然后是开放测试(任何有链接的人),最后是正式发布(所有人)。大多数首次上传的路径是:内部测试 → 修复问题 → 正式发布,历时约一周。
本教程涵盖一次性账号设置、签名密钥方案选择、首个 AAB 构建、提交所需的元数据、内部轨道上传,以及收到审核反馈时的应对方式。最终状态:你的应用正式上架 Play 商店,任何 Android 设备均可下载。
前往 play.google.com/console/signup,用你想用来拥有该应用的 Google 账号登录。选择个人或组织:
支付 25 美元(终身有效,此账号可无限发布应用)。提交证件后等待验证——个人账号通常 48 小时内完成,组织账号时间更长。
你需要在两种方案中选择一种:
选择 Play 应用签名。你接下来要生成的"上传密钥"就是本地构建所使用的签名密钥。
keytool -genkey -v \
-keystore ~/keys/mybrand-upload.keystore \
-keyalg RSA -keysize 2048 -validity 25000 \
-alias mybrand-upload
# Enter a password. Save it in your password manager.
# Fill in the X.500 fields (name, organization, country).
# 25000 days = ~68 years. Yes, really. Keystores aren't supposed to expire.
务必备份这个 keystore 文件:云存储、加密 U 盘、密码管理器附件——任何能在你笔记本电脑损坏后幸存的地方都行。一旦丢失,就必须走 Google 的申诉流程(流程存在,但极为缓慢)。把它当作一份不动产契约来对待。
keystore 密码和密钥密码(两者都会要求你输入)可以相同,很多人为了简便起见使用同一个密码。两者都应存入密码管理器。
在 app/build.gradle.kts(或 Groovy DSL 的 app/build.gradle)中添加发布签名配置:
android {
signingConfigs {
create("release") {
storeFile = file(System.getenv("UPLOAD_KEYSTORE_PATH") ?: "$rootDir/keystore-not-set")
storePassword = System.getenv("UPLOAD_KEYSTORE_PASSWORD")
keyAlias = "mybrand-upload"
keyPassword = System.getenv("UPLOAD_KEY_PASSWORD")
}
}
buildTypes {
release {
signingConfig = signingConfigs.getByName("release")
isMinifyEnabled = true
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
}
}
构建 bundle:
export UPLOAD_KEYSTORE_PATH=~/keys/mybrand-upload.keystore
export UPLOAD_KEYSTORE_PASSWORD='your-password'
export UPLOAD_KEY_PASSWORD='your-password'
./gradlew :app:bundleRelease
# Output:
# app/build/outputs/bundle/release/app-release.aab
这就是你要上传的文件。验证其签名是否正确:
jarsigner -verify -verbose -certs app/build/outputs/bundle/release/app-release.aab
# Last line should say: "jar verified."
echo "*.keystore" >> .gitignore,并通过环境变量或密钥管理器加载凭据。CI 构建应从加密密钥(GitHub Actions 加密密钥、AWS Secrets Manager 等)中获取 keystore,而非从仓库中读取。
Play Console → 创建应用。填写以下信息:
提交后,该应用将以草稿状态出现在 Play Console 中。此时还无法发布任何内容,你需要先在某个轨道上传已签名的 AAB,并填写完整的元数据。
在 Play Console 侧边栏中点击应用内容,逐项完成填写。未填写这些内容就提交是首次上传最常见的错误。
侧边栏主商店列表,必填素材如下:
adb exec-out screencap -p > screen.png。描述文案是最值得反复打磨的部分——上线后仍可编辑,因此首次发布时"足够好"就行了。图标和特色图片重新上传则相对麻烦。
侧边栏测试 → 内部测试 → 创建新版本:
app-release.aab,上传需 1–3 分钟。保存 → 审核版本 → 开始向内部测试版推出。版本通常在 5 分钟内处理完毕。
添加测试人员:内部测试 → 测试人员标签页 → 创建电子邮件列表(每行粘贴一个 Gmail 地址,最多 100 人)。保存后,每位测试人员会收到一个 Play 商店加入链接,点击后方可安装应用。
将加入链接发给测试人员。他们点击链接并接受后,访问该应用的 Play 商店页面(或内部测试直链)即可安装。版本推出后约 5–10 分钟,应用便可在他们的设备上安装。
内部测试确认构建无误后:
首次推送到正式发布:正式发布 → 创建新版本 → 从封闭测试版推广。添加版本说明后提交,然后等待。状态变更时会收到邮件通知。
ACCESS_FINE_LOCATION 权限。修改表单或移除该权限。targetSdkVersion 并重新构建。应用上线并配置好 Play 应用签名之后,后续更新会比第一次快得多:
# Bump versionCode and versionName in app/build.gradle.kts
# Build a new signed AAB
./gradlew :app:bundleRelease
# Upload it via the Play Console UI, OR via the official gradle plugin:
# https://github.com/Triple-T/gradle-play-publisher
./gradlew publishReleaseBundle
gradle-play-publisher 插件通过 service account JSON 密钥进行认证(从 Play Console → 设置 → 开发者账号 → API 访问权限下载),可以让你从 CI 推送版本。完成第一次手动上传后,所有后续发布都可以通过一步 CI 完成。