无法在发布模式下构建应用 - 密钥库被篡改,或密码错误

时间:2017-11-02 01:47:49

标签: android gradle android-keystore

我遇到了一个问题,我只能在调试模式下构建我的应用程序。当我尝试在发布时构建它时,无论是使用Android Studio还是./gradlew assembleRelease,我都会使密钥库被篡改,或密码错误错误消息。

问题是我可以生成已签名的,我只是在发布模式下构建应用时遇到问题。

以下是我在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
        }

拜托,我需要知道我做错了什么或者我忘记了什么。

1 个答案:

答案 0 :(得分:0)

由于Gradle守护程序已添加到Gradle,因此除非您添加System.console()标记,否则它无法再使用--no-daemon函数。

至于在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"))
    }
}