用 Gradle 处理 Android 签名配置

公司 Android 项目终于由 Eclipse 迁移到 Android Studio 上了,需要将之前在 Jenkins 上的构建任务修改一下支持 gradle 构建。
出于信息安全需要,开发人员不掌握生产环境使用的签名证书,但是 Jenkins 构建时需要自动的使用生产签名证书进行打包签名。

保护签名证书私钥

参考: https://developer.android.com/studio/publish/app-signing.html#secure-key

  1. 在项目中创建 keystore.properties,内容包含签名使用的配置信息,例如:
1
2
3
4
store=store_file_location
store_pwd=pwd
alias=alias_name
alias_pwd=alias_pwd

需要注意的是 keystore.properties 和使用的 store 文件不要添加到版本控制系统中。

  1. 在模块的 build.gradle 文件中,于 android {} 的 signingConfigs {} 中添加用于加载 keystore.properties 文件的代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
signingConfigs {
release {
v2SigningEnabled false
try {
def Properties keyProps = new Properties()
keyProps.load(new FileInputStream(file('keystore.properties')))
storeFile file(keyProps["store"])
storePassword keyProps["store_pwd"]
keyAlias keyProps["alias"]
keyPassword keyProps["alias_pwd"]
} catch (Exception ex) {
println(ex)
}
}
}
  1. 在模块的 build.gradle 文件中,于 android {} 的 buildTypes {} 中添加用指定使用的签名配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
buildTypes {
release {
buildConfigField "boolean", "LOG_DEBUG", "false"
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
debuggable false
# 加载 signingConfigs.release 签名配置
signingConfig signingConfigs.release
}

debug{
buildConfigField "boolean", "LOG_DEBUG", "true"
}
}
在 Jenkins 中使用

参考: https://developer.android.com/studio/build/index.html

需要在 Jenkins 中安装 Gradle 插件以支持 Gradle 构建。了解 Gradle 的构建流程之后,可以知道 IDE 中的打包操作可以等价转换为 CLI 命令。

在构建步骤中选择 Invoke Gradle script,在 Tasks 中输入,以下参数:

1
2
clean
assembleRelease

配置完成之后该 Jenkins 构建项目只会构建正式签名的 Android 包。

其他

如果你只想解决自动签名的问题,那么可以按官方文档上的做法,将加载配置放在模块的 build.gradle 文件中, android {} 块的前面加载。

1
2
3
4
5
6
7
8
9
10
...
def keystorePropertiesFile = rootProject.file("keystore.properties")

def keyProps = new Properties()

keyProps.load(new FileInputStream(keystorePropertiesFile))

android {
...
}

同样需要在 signingConfigs 块中使用加载好的配置信息

1
2
3
4
5
6
7
8
9
10
11
android {
signingConfigs {
config {
storeFile file(keyProps["store"])
storePassword keyProps["store_pwd"]
keyAlias keyProps["alias"]
keyPassword keyProps["alias_pwd"]
}
}
...
}

在 Build Variants 工具窗口中确定已选择发布构建类型。

然后点击 Build > Build APK 以构建您的发布构建,并确认 Android Studio 已在模块的 build/outputs/apk/ 目录中创建一个签署的 APK。