使用Gradle Android签署配置(例子)

・9 分钟阅读

签名应用程序

  • 安装前需要使用证书进行数字签名的Android应用程序

  • Android使用此证书标识了应用程序的作者,

  • 此证书不必由证书颁发机构签名(你可以使用自签署证书)

  • 有两种类型的签名模式debug moderelease mode

  • 在调试模式下,使用Android SDK工具生成的调试证书来签名应用程序。 此证书有一个有已知密码的私钥

  • 此证书位于$HOME/.android/debug.keystore

  • 在发布模式中,你可以使用自己的证书签名应用程序(实际上必须生成自己的密钥存储,

  • 有关签名android应用程序的更多信息
    http://developer.android.com/tools/publishing/app-signing.html

签名配置

  • 在基于Android项目的gradle 中应在gradle构建脚本中指定签名配置。

  • 以下是需要在gradle构建脚本中指定的详细信息

  1. 密钥库(位置)
  2. 密钥库密码
  3. 密钥别名名称
  4. 密钥密码
  5. 存储类型
  • 在调试版本中,不需要指定任何这些详细信息,它会自动获取调试证书详细信息,

  • 但是,除非显式定义了生成的签名配置,否则生成系统不会对发布版本进行签名,因此在发布类型中必须在gradle生成文件中指定上述详细信息,

  • 本文将向你提供有关指定发布签名配置的详细信息

目录结构

  • 下面是我的项目结构

Picture

  • 我在Score项目下有senz应用程序,我在senz应用程序中定义了build.gradle文件中的签名配置(因为它,

简单定义发布签名配置

  • 首次复制key-storesenz应用程序

Picture

  • 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:")
 }
 }
 ...
}
...
  • 当你从命令行构建时,它会提示输入密码,

Picture

  • 这个方法还有几个问题

问题1每次都会提示密码

  • 这个密码每次都会提示

  • 如果你清理了构建./gradlew clean,它会询问密码,

Picture


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,并将密码分配给配置密码(我使用密钥存储和密钥的密码),

Picture

  • 在这段代码中,我们使用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 {

...

}

Error:(10) java.awt.AWTError: Toolkit not found: apple.awt.CToolkit
> Toolkit not found: apple.awt.CToolkit

引用

  1. http://developer.android.com/sdk/installing/studio-build.html
  2. http://developer.android.com/tools/publishing/app-signing.html
  3. http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Signing-Configurations
  4. https://www.timroes.de/2013/09/22/handling-signing-configs-with-gradle/
  5. https://www.timroes.de/2014/01/19/using-password-prompts-with-gradle-build-files/
  6. http://gmariotti.blogspot.com/2013/10/common-tips-about-gradle.html
Zas12357386 profile image