无法在发布模式下构建应用程序 - 密钥库被篡改或密码不正确
Can't build app on release mode - Keystore was tampered with, or password was incorrect
我遇到了一个问题,我只能在调试模式下构建我的应用程序。当我尝试在发布时使用 Android Studio 或 ./gradlew assembleRelease
构建它时,我收到 Keystore was tampered with, or password was incorrect 错误消息。
问题是我可以生成签名,我只是在发布模式下构建我的应用程序时遇到问题。
以下是我在 build.gradle 中配置发布构建类型的方式:
gradle.taskGraph.whenReady { taskGraph ->
if (taskGraph.hasTask(':app:assembleRelase')) {
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.signingConfigs.release.storePassword = password
android.signingConfigs.release.keyPassword = password
}
}
上面的函数应该通过对话或命令行请求密钥和存储密码,但它被忽略了。
android {
...
signingConfigs {
config {
keyAlias 'my_alias'
keyPassword ''
storeFile file('../my_keystore.jks')
storePassword ''
}
}
buildTypes {
...
release {
minifyEnabled false
debuggable false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
buildConfigField("String", "DB_NAME", '"database.db"')
signingConfig signingConfigs.config
}
拜托,我需要知道我是否做错了什么,或者我是否忘记了什么。
由于 Gradle 守护程序已添加到 Gradle,除非您添加 --no-daemon
标志,否则它不再能够使用 System.console()
功能。
至于在 Gradle 构建过程中使用 Swing 功能,这不是一个好的做法,至少在这种情况下它根本不起作用。
所以总而言之,最好的办法是创建一个包含别名、密码和密钥库文件路径的属性文件,显然将该文件包含在 .gitignore 中并确保密钥库文件位于目录中出于安全原因,除了项目之外。
从属性文件中设置签名配置属性的方法如下代码所示:
signingConfigs {
config {
def properties = new Properties()
file("my_properties_file.properties").withInputStream { properties.load(it) }
keyPassword = properties.getProperty("my.key.password")
storePassword = properties.getProperty("my.store.password")
keyAlias = properties.getProperty("my.key.alias")
storeFile = file(properties.getProperty("my.file.path"))
}
}
我遇到了一个问题,我只能在调试模式下构建我的应用程序。当我尝试在发布时使用 Android Studio 或 ./gradlew assembleRelease
构建它时,我收到 Keystore was tampered with, or password was incorrect 错误消息。
问题是我可以生成签名,我只是在发布模式下构建我的应用程序时遇到问题。
以下是我在 build.gradle 中配置发布构建类型的方式:
gradle.taskGraph.whenReady { taskGraph ->
if (taskGraph.hasTask(':app:assembleRelase')) {
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.signingConfigs.release.storePassword = password
android.signingConfigs.release.keyPassword = password
}
}
上面的函数应该通过对话或命令行请求密钥和存储密码,但它被忽略了。
android {
...
signingConfigs {
config {
keyAlias 'my_alias'
keyPassword ''
storeFile file('../my_keystore.jks')
storePassword ''
}
}
buildTypes {
...
release {
minifyEnabled false
debuggable false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
buildConfigField("String", "DB_NAME", '"database.db"')
signingConfig signingConfigs.config
}
拜托,我需要知道我是否做错了什么,或者我是否忘记了什么。
由于 Gradle 守护程序已添加到 Gradle,除非您添加 --no-daemon
标志,否则它不再能够使用 System.console()
功能。
至于在 Gradle 构建过程中使用 Swing 功能,这不是一个好的做法,至少在这种情况下它根本不起作用。
所以总而言之,最好的办法是创建一个包含别名、密码和密钥库文件路径的属性文件,显然将该文件包含在 .gitignore 中并确保密钥库文件位于目录中出于安全原因,除了项目之外。
从属性文件中设置签名配置属性的方法如下代码所示:
signingConfigs {
config {
def properties = new Properties()
file("my_properties_file.properties").withInputStream { properties.load(it) }
keyPassword = properties.getProperty("my.key.password")
storePassword = properties.getProperty("my.store.password")
keyAlias = properties.getProperty("my.key.alias")
storeFile = file(properties.getProperty("my.file.path"))
}
}