Skip to content

签名配置与安全实战

在 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.ktslibs.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 签名,兼容性最广。必选
V2Android 7.0全文件指纹校验,安装速度提升 50%。必选
V3Android 9.0支持签名证书轮转(Key Rotation)。大型应用推荐
V4Android 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 签名方案定期更新签名证书以降低泄露风险。

通过上述两种方案,您可以实现从“手动开发”到“全自动化部署”的平滑过渡。