我们在《Android Gradle使用详解(三) 之 Android Gradle插件配置详解》中有简单介绍过signingConfigs{}配置及其使用到的字段意思。它是用于给 一个APP签名配置的。一个APP只有在签名之后才能发布、安装和使用,签名是保护APP的方式,它能标记APP的唯一性,防止恶意篡改。一般地我们在开发过程中使用的debug编译模式时,Android SDK已帮我们打上了一个默认的debug签名证书(该签名证书位于$HOME/.android/debug.keystore目录中),所以我们可以直接调试安装在手机上。但是在正式发布时构建的release模式版本时,我们就要对其进行配置签名证书了。
配置签名
关于配置签名可以在signingConfigs{}中进行,示例如:
android {
……
defaultConfig {
……
}
signingConfigs {
releaseConfig {
storeFile rootProject.file("buildkey/mykey.keystore")
storePassword "password"
keyAlias "MyKey"
keyPassword "password"
}
debugConfig { // debug可不配置
storeFile rootProject.file("buildkey/debug.keystore")
storePassword "android"
keyAlias "androiddebugkey"
keyPassword "android"
}
}
buildTypes {
……
}
}
字段介绍
storeFile 指定签名证书文件,接收一个文件类型
storePassword 配置签名证书文件的密码
keyAlias 配置签名证书中密钥别名
keyPassword 配置签名证书中该密钥的密码
应用签名
上述操作只是配置了签名证书,要使用它还需要在defaultConfig{}或buildTypes{}中进行signingConfig字段的指定,正如上面介绍defaultConfig{}或buildTypes{}中所提到的。示例:
android {
……
defaultConfig {
……
signingConfig signingConfigs.releaseConfig
}
signingConfigs {
……
}
buildTypes {
……
}
}
或者针对构建类型分别配置,比如release和debug区分配置:
android {
……
defaultConfig {
……
}
signingConfigs {
……
}
buildTypes {
release {
……
signingConfig signingConfigs.releaseConfig
}
}
}
值得注意一点就是,signingConfigs{}的配置一定要在buildTypes{}之前,否则会产生错误!
隐藏签名文件
上面示例中展示了签名证书的配置和使用,但是忽略了一个安全性问题。签名信息是我们应用非常重要的信息,是公司重要的资源,如果我们项目中都把APP的签名证书文件和相关密钥放在项目中托管在git上的话,那岂不是所有的开发者都能获得到签名证书文件和密钥,这种方式出于安全考虑确实有所欠佳。所以要解决这类问题,最好的办法是将证书文件和相关密钥放在服务器编译机上,然后配置相应的环境变量。如若各位开发者本地不存在环境变量就使用默认的debug签名证书,这样的话又虽能解决编译的问题又可提高安全性了。使用示例如:
android {
……
defaultConfig {
……
}
signingConfigs {
def appStoreFile = System.getenv("STORE_FILE");
def appStorePassword = System.getenv("STORE_PASSWORD");
def appKeyAlias = System.getenv("KEY_ALIAS");
def appKeyPassword = System.getenv("KEY_PASSWORD");
if (!appStoreFile || !appStorePassword || !appKeyAlias || !appKeyPassword) {
appStoreFile = "buildkey/debug.keystore" // 将$HOME/.android/debug.keystore的debug证书文件拷贝到工程目录中
appStorePassword "android"
appKeyAlias "androiddebugkey"
appKeyPassword "android"
}
releaseConfig {
storeFile rootProject.file(appStoreFile)
storePassword appStorePassword
keyAlias appKeyAlias
keyPassword appKeyPassword
}
}
buildTypes {
release {
……
signingConfig signingConfigs.releaseConfig
}
}
}