使用Gradle Android签署配置(例子)
Zas12357386
・9 分钟阅读
签名应用程序
安装前需要使用证书进行数字签名的Android应用程序
Android使用此证书标识了应用程序的作者,
此证书不必由证书颁发机构签名(你可以使用自签署证书)
有两种类型的签名模式
debug mode
和release mode
在调试模式下,使用Android SDK工具生成的调试证书来签名应用程序。 此证书有一个有已知密码的私钥
此证书位于
$HOME/.android/debug.keystore
上在发布模式中,你可以使用自己的证书签名应用程序(实际上必须生成自己的密钥存储,
有关签名android应用程序的更多信息
http://developer.android.com/tools/publishing/app-signing.html
签名配置
在基于Android项目的
gradle
中应在gradle构建脚本中指定签名配置。
以下是需要在gradle构建脚本中指定的详细信息
- 密钥库(位置)
- 密钥库密码
- 密钥别名名称
- 密钥密码
- 存储类型
在调试版本中,不需要指定任何这些详细信息,它会自动获取调试证书详细信息,
但是,除非显式定义了生成的签名配置,否则生成系统不会对发布版本进行签名,因此在发布类型中必须在gradle生成文件中指定上述详细信息,
本文将向你提供有关指定发布签名配置的详细信息
目录结构
- 下面是我的项目结构
- 我在
Score
项目下有senz
应用程序,我在senz
应用程序中定义了build.gradle
文件中的签名配置(因为它,
简单定义发布签名配置
- 首次复制
key-store
到senz
应用程序
- 在
build.gradle
文件(需要在构建文件中的android
部分)中定义密钥存储详细信息
android {
...
signingConfigs {
release {
storeFile file("release-key.keystore")
storePassword 'passwotd'
keyAlias 'alias'
keyPassword 'password'
}
}
buildTypes {
release {
...
signingConfig signingConfigs.release
}
debug {
debuggable true
}
}
}
...
- 现在从命令行执行以下命令
./gradlew assembleRelease
它将生成发布版本
Score/senz/build/apk/senz-release.apk
在上面的签名配置我已经在我的gradle文件中定义了所有密钥存储和密钥密码,这不是一个好的安全实践,
为了解决安全问题,你可以指定这些密码(如果你正从命令行构建)的构建进程提示,
使用gradle构建文件提示密码
- 你可以从
System.console()
获得密码
storePassword System.console().readLine("nKeystore password:")
keyPassword System.console().readLIne("nKey password:")
- 所以构建文件的外观如下
android {
...
signingConfigs {
release {
storeFile file("release-key.keystore")
storePassword System.console().readLine("nKeystore password:")
keyAlias 'alias'
keyPassword System.console().readLIne("nKey password:")
}
}
...
}
...
- 当你从命令行构建时,它会提示输入密码,
- 这个方法还有几个问题
问题1每次都会提示密码
这个密码每次都会提示
如果你清理了构建
./gradlew clean
,它会询问密码,
为了解决这个问题我们可以使用Gradle TaskExecutionGraph
http://www.gradle.org/docs/current/javadoc/org/gradle/api/execution/TaskExecutionGraph.html通过使用taskGraph,我们可以限制特定构建任务的密码提示,
这样我们就可以在只有
assembleRelease
时限制密码提示
gradle.taskGraph.whenReady { taskGraph ->
if(taskGraph.hasTask(':senz:assembleRelease')) {
password = System.console().readPassword("nEnter password:")
password = new String(password)
if(password.size() <= 0) {
throw new InvalidUserDataException("Empty password")
}
// set signing config key passwords
android.signingConfigs.release.storePassword = password
android.signingConfigs.release.keyPassword = password
}
}
android {
...
signingConfigs {
release {
storeFile file("release-key.keystore")
storePassword ''
keyAlias 'alias'
keyPassword ''
}
}
...
}
- 这会仅要求密码
assembleRelease
,并将密码分配给配置密码(我使用密钥存储和密钥的密码),
在这段代码中,我们使用
System.console().readPassword()
而不是readLine()
,readPassword()
函数返回一个字符数组。 因此需要将它转换为字符串,否则生成会失败,SignConfigs.release
密码设置为空因为我们通过taskGraph
读取它
android {
...
signingConfigs {
release {
storeFile file("release-key.keystore")
storePassword ''
keyAlias 'alias'
keyPassword ''
}
}
...
}
问题2无控制台
如果你在Android Studio中运行以上构建没有System.console(),它将返回null,
因此AndroidStudio上的构建将失败
在这里,而不是从控制台获取密码,我们可以在没有控制台时从对话框中提示它(实际上是从AndroidStudio运行发布版本时),
下面的代码会通过
Groovy SwingBuilder
完成
import groovy.swing.SwingBuilder
...
gradle.taskGraph.whenReady { taskGraph ->
if(taskGraph.hasTask(':senz:assembleRelease')) {
def password =""
if (System.console() == null) {
new SwingBuilder().edt {
dialog(modal: true,
title:"Enter password",
alwaysOnTop: true,
resizable: false,
locationRelativeTo: null,
pack: true,
show: true
) {
vbox {
label(text:"Enter password:")
input = passwordField()
button(defaultButton: true,
text: 'OK',
actionPerformed: {
password = input.password;
dispose();
})
}
}
}
} else {
password = System.console().readPassword("nEnter password:")
password = new String(password)
}
if (password.size() <= 0) {
throw new InvalidUserDataException("Empty password")
}
}
}
android {
...
}
更多关于Groovy SwingBuilder的信息
http://groovy.codehaus.org/GUI Programming with Groovy
http://groovy.codehaus.org/Swing Builder请注意,在上的代码中,代码可以引发异常,
Error:(10) java.awt.AWTError: Toolkit not found: apple.awt.CToolkit
> Toolkit not found: apple.awt.CToolkit
- 我已经将完整的
build.grade
文件上传到github https://github.com/erangaeb/dev-notes/blob/master/gradle/Score/senz/build.gradle
引用
- http://developer.android.com/sdk/installing/studio-build.html
- http://developer.android.com/tools/publishing/app-signing.html
- http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Signing-Configurations
- https://www.timroes.de/2013/09/22/handling-signing-configs-with-gradle/
- https://www.timroes.de/2014/01/19/using-password-prompts-with-gradle-build-files/
- http://gmariotti.blogspot.com/2013/10/common-tips-about-gradle.html