签名配置与安全实战
在 Android 开发中,签名不仅是应用发布的凭证,更是安全校验的核心。本章将展示两种工业级的签名配置方案,确保密钥安全且支持自动化构建。
方案 A:手动解析 local.properties (传统方式)
这种方式灵活性最高,适合需要根据不同逻辑(如 CI 环境判断)动态调整签名的场景。
kotlin
import java.util.Properties
// 1. 读取属性文件
val properties = Properties().apply {
val propertiesFile = rootProject.file("local.properties")
if (propertiesFile.exists()) {
load(propertiesFile.inputStream())
}
}
android {
signingConfigs {
create("release") {
// 优先从环境变量读取(CI/CD 环境),拿不到则读取本地属性
storeFile = file(System.getenv("SIGNING_STORE_FILE") ?: properties.getProperty("RELEASE_STORE_FILE"))
storePassword = System.getenv("SIGNING_STORE_PASSWORD") ?: properties.getProperty("RELEASE_STORE_PASSWORD")
keyAlias = System.getenv("SIGNING_KEY_ALIAS") ?: properties.getProperty("RELEASE_KEY_ALIAS")
keyPassword = System.getenv("SIGNING_KEY_PASSWORD") ?: properties.getProperty("RELEASE_KEY_PASSWORD")
}
}
buildTypes {
getByName("release") {
signingConfig = signingConfigs.getByName("release")
}
}
}properties
# 本地路径与密码 (此文件必须在 .gitignore 中排除)
RELEASE_STORE_FILE=/Users/virogu/keystores/release.jks
RELEASE_STORE_PASSWORD=your_password
RELEASE_KEY_ALIAS=your_alias
RELEASE_KEY_PASSWORD=your_password方案 B:Google Secrets 插件 (推荐方案)
由 Google 维护的 secrets-gradle-plugin 是目前最优雅的方案。它能自动将 .properties 文件中的值注入到 BuildConfig 或作为项目属性,无需手动编写解析代码。
1. 添加插件依赖
在 根项目 的 build.gradle.kts 或 libs.versions.toml 中配置:
kotlin
// build.gradle.kts (Project)
plugins {
id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin") version "2.0.1" apply false
}2. 应用插件
在 App 模块 的 build.gradle.kts 中应用并配置:
kotlin
plugins {
id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
}
secrets {
// 指定存放秘密的文件名(默认为 local.properties)
propertiesFileName = "secrets.properties"
// 是否将所有属性自动注入到 BuildConfig
defaultPropertiesFileName = "local.defaults.properties"
}
android {
signingConfigs {
create("release") {
// 插件会自动将 secrets.properties 中的键值对映射为项目属性
// 我们可以直接通过 project.findProperty 访问
storeFile = file(project.findProperty("RELEASE_STORE_FILE") as String)
storePassword = project.findProperty("RELEASE_STORE_PASSWORD") as String
// ... 同上
}
}
}签名方案版本对比 (V1 - V4)
| 版本 | 引入时间 | 优势 | 建议 |
|---|---|---|---|
| V1 | - | 基础 JAR 签名,兼容性最广。 | 必选 |
| V2 | Android 7.0 | 全文件指纹校验,安装速度提升 50%。 | 必选 |
| V3 | Android 9.0 | 支持签名证书轮转(Key Rotation)。 | 大型应用推荐 |
| V4 | Android 11 | 支持 ADB 增量安装,极大缩短开发调试等待。 | 调试包推荐开启 |
证书指纹查询命令
在对接微信、地图等三方 SDK 时,经常需要获取签名文件的指纹。
bash
# 查询 JKS 文件详细信息
keytool -list -v -keystore your_key.jks -alias your_alias安全最佳实践清单
- 隔离密钥: 绝不将
.jks文件放在项目根目录下。建议放在系统用户目录(如~/.android/)并通过绝对路径引用。 - CI/CD 安全: 在 GitHub Actions 中,严禁将密码写在
yml文件中。应使用Settings > Secrets注入,并通过环境变量传给 Gradle。 - 定期轮转: 对于核心应用,建议利用 V3 签名方案定期更新签名证书以降低泄露风险。
通过上述两种方案,您可以实现从“手动开发”到“全自动化部署”的平滑过渡。