Android应用的签名是确保应用安全性和身份验证的重要环节。以下是详细设置步骤及扩展知识:
1. 生成密钥库(Keystore)
使用Java的`keytool`工具创建密钥库文件:
bash
keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-alias
- `-keystore`:指定密钥库文件名(如`.jks`或`.keystore`)。
- `-alias`:密钥别名,用于后续签名时引用。
- `-validity`:证书有效期(天),建议设置较长时间(如10000天)。
2. 配置Gradle签名信息
在模块的`build.gradle`文件中配置签名配置:
groovy
android {
signingConfigs {
release {
storeFile file("my-release-key.jks")
storePassword "your_password"
keyAlias "my-alias"
keyPassword "your_key_password"
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
}
- 避免将密码硬编码在文件中,可通过环境变量或`local.properties`注入。
3. V1与V2签名方案
- V1 (JAR签名):兼容旧版Android,仅校验ZIP条目。
- V2 (APK签名方案):Android 7.0引入,校验整个APK文件,安全性更高。
在Gradle中启用:
groovy
signingConfigs {
release {
v1SigningEnabled true
v2SigningEnabled true
}
}
4. 签名验证与排查问题
- 使用`apksigner`验证签名:
bash
apksigner verify -v my_app.apk
- 常见错误:
- 密钥库密码错误。
- 别名或密钥密码不匹配。
- 未启用V2签名导致安装失败。
5. 签名对应用更新的影响
- 相同包名但签名不同会导致安装失败。
- 丢失密钥库将无法推送应用更新,需妥善备份。
- 使用Google Play应用签名时,可上传原始密钥后由Google管理。
6. 进阶:自动签名与CI/CD集成
- 在持续集成中通过环境变量传递密码:
groovy
storePassword System.getenv("STORE_PASSWORD")
- 使用`signingReport`任务检查当前配置:
bash
./gradlew signingReport
7. 安全建议
- 禁止在版本控制中提交密钥库文件。
- 为调试和发布环境使用不同密钥。
- 考虑使用Android Studio的`Export Signed Bundle/APK`向导简化流程。
签名不仅是技术步骤,更是应用发布流程的核心环节,直接影响版本迭代和安全更新。