应用签名
了解密钥和 Play 应用签名
应用签名 是 CoddyKit 上的免费 Android Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Android Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Android Academy 课程共包含 4 节课。
应用为什么必须签名
除非应用经过数字签名,否则 Android 不会安装它。签名可以证明两件事:应用由谁发布,以及 APK 自发布后未被篡改。
更重要的是,签名会将更新与原始应用关联起来。只有使用与已安装版本相同的密钥签名,更新才会被接受。如果丢失该密钥,您将永远无法再更新应用。
本课将介绍密钥库、签名配置,以及 Google 更安全的现代方案:Play 应用签名。
密钥库和密钥
您的签名身份存储在密钥库文件(.jks 或 .keystore)中。一个密钥库可以包含多个密钥;每个密钥都有一个别名和独立的密码。
- 密钥库密码 — 用于解锁文件。
- 密钥别名 — 用于标识其中的密钥。
- 密钥密码 — 用于解锁指定的密钥。
您每天运行的调试构建会自动使用临时调试密钥库签名。发布时则需要使用您自己的密钥库。
创建密钥库
您可以在 Android Studio 对话框中创建密钥库,也可以使用随 JDK 一起提供的 keytool 命令创建。
请设置较长的有效期(25 年以上)——如果密钥过期,您将无法发布更新。RSA 2048 是标准配置。
keytool -genkeypair \
-v \
-keystore release.jks \
-alias upload \
-keyalg RSA \
-keysize 2048 \
-validity 10000signingConfigs 代码块
要在 Gradle 构建期间自动签名,请声明一个 signingConfigs 条目,并将其关联到 release 构建类型。
这种方式可以正常工作,但请注意,密码此时就直接写在构建文件中——下一步我们会解决这个问题。
android {
signingConfigs {
create("release") {
storeFile = file("release.jks")
storePassword = "superSecret"
keyAlias = "upload"
keyPassword = "superSecret"
}
}
buildTypes {
release {
signingConfig = signingConfigs.getByName("release")
isMinifyEnabled = true
}
}
}不要将机密信息提交到 Git
切勿将密码或密钥库提交到版本控制系统。请改为从本地且已被 Git 忽略的 keystore.properties 文件中读取它们。
将 keystore.properties 和 *.jks 添加到 .gitignore。
// top of app/build.gradle.kts
val keystoreProps = Properties().apply {
val f = rootProject.file("keystore.properties")
if (f.exists()) load(f.inputStream())
}
android {
signingConfigs {
create("release") {
storeFile = file(keystoreProps["storeFile"] as String)
storePassword = keystoreProps["storePassword"] as String
keyAlias = keystoreProps["keyAlias"] as String
keyPassword = keystoreProps["keyPassword"] as String
}
}
}keystore.properties 文件
对应的属性文件是一个简单的 key=value 列表,应排除在 Git 之外并安全存储(例如存放在密码管理器或 CI 机密存储中)。
在 CI 服务器上,您应将这些内容作为由环境变量提供的机密注入,而不是使用已提交到版本库的文件。
# keystore.properties (git-ignored!)
storeFile=release.jks
storePassword=superSecret
keyAlias=upload
keyPassword=superSecretPlay 应用签名
现代版 Play 使用Play 应用签名。Google 会将真正的应用签名密钥保存在其安全基础设施中,并使用它为交付给用户的 APK 签名。
您只需管理上传密钥:使用它为捆绑包签名并上传。Play 会验证您的上传密钥,移除该签名,然后使用应用签名密钥重新签名。
最大的好处是:即使您丢失上传密钥,也可以申请重置;而应用签名密钥(用户信任的密钥)仍由 Google 安全保管。
上传密钥与应用签名密钥
两个密钥,各司其职——不要混淆:
- 上传密钥 — 属于您。用于为您上传的 AAB 签名。丢失后可以重置。
- 应用签名密钥 — 属于 Google(或由您上传一次)。用于为用户安装的最终 APK 签名。永久有效。
注册新应用时,最简单的方式是让 Google 生成应用签名密钥,然后使用您的上传密钥为上传内容签名。
验证签名
要确认某个构件的签名方式,请使用 Android SDK 构建工具中的 apksigner。它会报告签名证书,以及存在的签名方案(v1/v2/v3)。
比较证书的 SHA-256 指纹,也是将应用注册到 Firebase 或 Google Sign-In 等服务时所采用的方式。
# Verify and print signer certificates of an APK
apksigner verify --print-certs app-release.apk
# Show the SHA-256 fingerprint of a keystore key
keytool -list -v -keystore release.jks -alias upload保护您的密钥
上传密钥很难替换,而应用签名密钥(如果由您自行管理)则无法替换。请像保护最珍贵的资产一样保护它们:
- 将密钥库备份到至少两个安全位置。
- 将密码存放在密码管理器中,绝不要存放在源代码中。
- 使用 Play 应用签名,这样丢失上传密钥后仍可恢复。
- 限制团队中可以访问密钥库的人员。
许多已发布的应用仅仅因为开发者丢失密钥、无法继续发布更新而被放弃。
整合起来
完整的发布签名流程如下:
- 使用
keytool创建上传密钥库。 - 将其接入
signingConfigs,并从keystore.properties读取机密信息。 - 使用
./gradlew bundleRelease构建已签名的.aab。 - 上传到 Play,Play 会在交付给用户之前使用应用签名密钥重新签名。
从现在起,每次更新都必须使用同一个上传密钥签名。
快速检查
启用 Play 应用签名后,您使用哪个密钥为要上传的捆绑包签名?如果丢失该密钥,会发生什么?
回顾:应用签名
签名是 Android 应用能够安装和更新的基础:
- 密钥库用于存放密钥;每个密钥都有别名和密码。
- 使用
keytool创建长期有效的密钥,并将其接入signingConfigs。 - 通过
keystore.properties和.gitignore,不要将密码提交到 Git。 - Play 应用签名将密钥分为您的可重置上传密钥和 Google 永久保管的应用签名密钥。
- 请谨慎备份密钥——密钥丢失可能导致应用无法继续运营。
下一步:设置 Play 管理中心和应用商店详情页。
常见问题解答
「应用签名」课时是免费的吗?
是的 — 「应用签名」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Android Academy 课程的其余内容,请升级到 CoddyKit PRO。 Android Academy 课程共包含 4 节课。
「应用签名」这节课中我会学到什么?
了解密钥和 Play 应用签名 你通过在浏览器中直接运行的动手代码来练习 Android Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Android Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Android Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「应用签名」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Android Academy 课中编写并运行代码吗?
能。每节 Android Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。