gradlew assembleDebug需要我的发布密钥密码

时间:2014-06-08 17:50:02

标签: gradle build android-gradle release

我添加了签名设置,the guide说。现在当我运行./gradlew assembleDebug时,它需要我的密钥库和密钥密码,最后有两个APK文件:

  1. ./主/建造/输出/ APK /主debug.apk
  2. ./主/建造/输出/ APK /主调试unaligned.apk
  3. 所以Gradle构建了我的模块的调试版本,但需要释放密钥。

    构建模块的build.gradle文件位于下方。

    apply plugin: 'android'
    
    android {
        compileSdkVersion 19
        buildToolsVersion '19.1.0'
    
        signingConfigs {
            release {
                storeFile file("my-release-key.keystore")
                storePassword System.console().readLine("\nKeystore password: ")
                keyPassword System.console().readLine("Key password: ")
                keyAlias "my_key"
            }
        }
    
        defaultConfig {
            minSdkVersion 9
            targetSdkVersion 19
            versionCode 1
            versionName "1.0"
        }
    
        buildTypes {
            release {
                runProguard true
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
                signingConfig signingConfigs.release
            }
        }
    }
    
    dependencies {
        compile 'com.android.support:support-v4:19.0.1'
        compile 'com.android.support:appcompat-v7:19.0.1'
        compile project(':Log-Wrapper')
        compile 'com.google.android.gms:play-services:+'
    }
    

    更新#1。

    https://stackoverflow.com/a/24281294/1065835的解决方案有效,我接受了答案。但我个人更喜欢使用here描述的方法。发布密钥存储在本地且安全,每次编译发布版本时都无需键入密码。

2 个答案:

答案 0 :(得分:3)

似乎我可以合并一些在这里和那里拾起的建议.. ..我得到了它。

问题似乎是在build.gradle中编写ANYWHERE这样的事实:

storePassword System.console().readLine("\nKeystore password: ")

它将在任何时候执行。

我放在一起的解决方案是,在buildTypes块之前创建一个signedCongif块:

signingConfigs {
    release {
        storeFile file("c://my.keystore")
        storePassword "" // REQUIRED otherwise cannot be overwritten
        keyAlias "myAlias"
        keyPassword "" // REQUIRED otherwise cannot be overwritten
    }
}   

buildTypes {
    [...]

用这个调整gradle配置:

gradle.taskGraph.whenReady { taskGraph ->
if(taskGraph.hasTask(assembleRelease) || taskGraph.hasTask(installRelease)) {
    // Only execute when we are trying to assemble a release build
    def passKeystore = System.console().readLine("\nKeystore password: ")
    def passKey = System.console().readLine("\nKey password: ")
    android.signingConfigs.release.storePassword = passKeystore
    android.signingConfigs.release.keyPassword = passKey
}

}

请注意:
1.这个区块位于“android {}”之外 2.这仅在COMMAND LINE执行中进行了测试。似乎在没有可用的控制台的情况下需要一些修复。

答案 1 :(得分:0)

好像只有3个选项:

  1. 将我的签名配置解压缩到单独的pseduo-project
  2. 自动签名,但使用发布密钥签署一切
  3. 在命令行上手动输入密码
  4. 这是我的解决方法,也是实现完美平衡的第四个选择:

    apply plugin: 'com.android.application'
    
    gradle.taskGraph.whenReady { taskGraph ->
        if(taskGraph.hasTask(':app:assembleRelease')) {
            android.signingConfigs.release.storeFile = file(KEYSTORE)
            android.signingConfigs.release.storePassword = STOREPASS
            android.signingConfigs.release.keyAlias = KEY_ALIAS
            android.signingConfigs.release.keyPassword = KEYPASS
        }
    }
    
    android {
        ...
        defaultConfig {
            ...
        }
        signingConfigs {
            debug {
    
            }
            release {
    
            }
        }
        buildTypes {
        debug {
                ...
            }
            release {
                ...
                //signingConfig signingConfigs.release
            }
        }
    }
    

    这允许您仅在发布版本

    上使用存储的密钥和签名