在使用gradle命令执行打包apk时,需要在build文件中配置签名,
signingConfigs { //签名,这里的文件名和密码是错的,后面还会有从外部导入的语句
debug {
storeFile file("./MyApplication5.jks") //签名文件
storePassword "bihansheng" //密码
keyAlias "MyApplication "
keyPassword "bihansheng"
}
}
但是这样直接写在gradle中是不安全(把密码暴露在了代码中,项目被反编译时就会被发现)的,
网上大部分文章都说可以用一下方式,将gradle文件中配置签名文件的代码,这样在命令 执行 命令时,就会被要求输入密码。
signingConfigs { //gradle assembleRelease
myConfig {
storeFile file("<span style="font-family: Arial;">./MyApplication5.jks</span>")
storePassword System.console().readLine("\nKeystore password: ")
keyAlias "<span style="font-family: Arial;">MyApplication </span>"
keyPassword System.console().readLine("\nKey password: ")
}
}
但是在实际使用,会报错:
网上有解决方法是,使用命令行打包,(这个错误是因为androidStudio中认为这个方法是非法的)
但是这样的的话使用androidStudio不能运行项目,因为有没有解决的bug。
为了解决这个问题,在网上找到一种解决方法,主要思想是引入一种被androidStudio认可的语言,来代替这种不被认可的方法。
在gradle文件最上面加入
import groovy.swing.SwingBuilder
引入新的包。并在文件中加入下面的代码(需要根据具体的情况修改相关的配置)
gradle.taskGraph.whenReady { taskGraph ->
if(taskGraph.hasTask(':app:assembleRelease') || taskGraph.hasTask(':app:assemble_360Release') ) {//注意,这里只针对“assembleRelease”和“assemble_360Release”命令,如果要求其他命令也执行输入密码操作,需要在这里添加“||”判断
def storePass = ''
def keyPass = ''
if(System.console() == null) {
new SwingBuilder().edt {
dialog(modal: true, title: 'Enter password', alwaysOnTop: true, resizable: false, locationRelativeTo: null, pack: true, show: true) {
vbox { // Put everything below each other
label(text: "Please enter store passphrase:")
def input1 = passwordField()
label(text: "Please enter key passphrase:")
def input2 = passwordField()
button(defaultButton: true, text: 'OK', actionPerformed: {
storePass = input1.password;
keyPass = input2.password;
dispose();
})
}
}
}
} else {
storePass = System.console().readPassword("\nPlease enter store passphrase: ")
keyPass = System.console().readPassword("\nPlease enter key passphrase: ")
}
if(storePass.size() <= 0 || keyPass.size() <= 0) {
throw new InvalidUserDataException("You must enter the passwords to proceed.")
}
storePass = new String(storePass)
keyPass = new String(keyPass)
android.signingConfigs.debug.storePassword = storePass//用输入的密码代替配置中的storePassword
android.signingConfigs.debug.keyPassword = keyPass
}
}
注意:1、这里的“ android.signingConfigs.debug.storePassword”,是配置清单signingConfigs中的参数,
2、在执行命令后,控制台中会显示“Please enter store passphrase:”,当你敲击键盘输入密码时,控制台中是不会显示你输入的密码的,不要惊慌,按“enter”键继续,输入完两个密码之后,会继续执行打包操作。(这个问题也浪费了我不少时间,当时还以为是哪个地方出错了)