0Pricing
Android Academy · 课时

应用签名

了解密钥和 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 10000

signingConfigs 代码块

要在 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=superSecret

Play 应用签名

现代版 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 准备发布构建
  2. 应用签名
  3. Play 控制台与应用列表
  4. 分阶段发布与更新
← 返回 Android Academy