其他
Gradle配置,Android应用签名详解
本文作者
作者:yechaoa
链接:
https://juejin.cn/post/7404778275019407412
本文由作者授权发布。
版本更新时,新版本APK必须使用相同密钥签名,否则无法覆盖安装;如果签名变更,也无法更新应用,必须卸载重新安装。可见签名对Android应用发布的重要性。
密钥库: 密钥库路径(Key store path):输入一个存储密钥库文件的路径并命名,例如my-release-key.jks。 密钥库密码(Password):输入并确认密钥库的密码。 秘钥: 秘钥别名(Alias):为新的密钥创建一个别名,例如my-key-alias。 秘钥密码(Key password):输入并确认密钥的密码。通常与密钥库的密码相同,但也可以选择不同的密码。 有效期(Validity (years)):设置密钥的有效期,例如25年(通常是设置一个较长的时间)。 证书(Certificate):填写证书信息,包括名字、组织单位、组织、市、州/省和国家代码(例:CN)。
填写完所有信息之后,点击OK按钮即可创建密钥文件。
storePassword=myStorePassword
keyPassword=myKeyPassword
keyAlias=myKeyAlias
storeFile=myStoreFileLocation
import java.util.Properties
import java.io.FileInputStream
val keystorePropertiesFile = rootProject.file("keystore.properties")
val keystoreProperties = Properties()
keystoreProperties.load(FileInputStream(keystorePropertiesFile))
android {
...
}
...
android {
signingConfigs {
create("config") {
keyAlias = keystoreProperties["keyAlias"] as String
keyPassword = keystoreProperties["keyPassword"] as String
storeFile = file(keystoreProperties["storeFile"] as String)
storePassword = keystoreProperties["storePassword"] as String
}
}
...
}
buildTypes {
release {
signingConfig = signingConfigs.getByName("release")
// ...
}
}
在本地开发阶段,Android Studio会自动生成Debug签名,无需手动配置,但是Debug签名无法用于应用发布。
5.1、介绍
美团基于v2签名方案的多渠道打包方案(walle)原理是:打包过程中在META-INF目录下添加空文件用来作为渠道的唯一标识。 在v3签名方案中,基于 Merkle 哈希树对整个APK文件进行签名检查,确保APK文件的完整性,对APK进行的任何修改都会使APK签名作废,从而导致安装失败。而META-INF作为APK的一部分(签名块),自然也是会被签名检查,且不能修改的。 所以这也是walle为什么会在Android 9.0(v3)以后失效的原因。
5.2、选择签名方案
5.3、配置签名方案
// 配置签名方案
buildTypes {
release {
// ...
// 启用v1签名
v1SigningEnabled true
// 启用v2签名
v2SigningEnabled true
// 启用v3签名
v3SigningEnabled true
// 启用v4签名
v4SigningEnabled true
}
}
5.4、APK签名验证流程
校验APK文件中是否存在v4签名文件,存在则继续确认v2或v3方案,因为v4签名本身不足以验证APK的完整性和来源,所以需要与v2或v3方案结合使用,验证通过则允许安装;如果不存在v4签名文件或验证不通过则继续走v3签名验证流程。 v3签名方案的验证流程,先校验APK文件中是否存在v3签名方案的签名块,存在且校验通过则允许安装,否则拒接安装;如果不存在则继续走v2签名验证流程。 v2签名方案的验证流程,先校验APK文件中是否存在v2签名方案的签名块,存在且校验通过则允许安装,否则拒接安装;如果不存在则继续走v1签名验证流程。 v1签名方案的验证流程,验证通过则允许安装,否则拒接安装。
5.5、查看应用签名方案
5.5.1、配置环境
export PATH=$PATH:~/Library/Android/sdk/build-tools/33.0.1
Android SDK路径和版本号替换成你自己的。
source ~/.bashrc
// or
source ~/.zshrc
5.5.2、apksigner使用
apksigner verify --verbose --print-certs /Users/yechao/AndroidStudioProjects/GradleX/app/release/app-release.apk
apk地址换成你自己的。
在输出信息中,可以看到v1 scheme、v2 scheme、v3 scheme和v4 scheme的相关信息,true表示该签名方案开启,false表示关闭,默认开启v1、v2方案。
6.1、signingReport
6.2、keytool
6.2.1、keystore方式
keytool -list -v -keystore your-keystore-file.jks
6.2.2、apk方式
keytool -printcert -jarfile your-apk-file.apk
不要直接明文配置在build.gradle文件中。 尽量不要使用网络传输,选择离线传输方式,避免签名秘钥泄露。 如果是出海应用,可以将签名秘钥上传至Google Play,由Google来对秘钥进行管理和保护,可以提高签名秘钥的安全性。 可以将签名文件放在远端,打包时将签名文件下载到本地,打包结束后自动删除文件。 在CI/CD构建中,可以将签名文件放在CI服务上,并将签名信息配置到环境变量中,运行时从CI服务中读取。 将签名文件和签名配置单独抽成一个项目,然后以插件的形式依赖进主项目里,也可以做到隔离效果。
GitHub
相关文档
Sign your app
apksigner
https://developer.android.com/tools/apksigner?hl=zh-cn
SigningConfig
https://developer.android.com/reference/tools/gradle-api/8.2/com/android/build/api/dsl/SigningConfig
Application Signing
https://source.android.com/docs/security/features/apksigning
最后推荐一下我做的网站,玩Android: wanandroid.com ,包含详尽的知识体系、好用的工具,还有本公众号文章合集,欢迎体验和收藏!
推荐阅读:
扫一扫 关注我的公众号
如果你想要跟大家分享你的文章,欢迎投稿~
┏(^0^)┛明天见!