14

キーストアのパスワードをプレーン テキストで記述しないようにするために、android Gradle プラグインによって作成されたassembleReleaseタスクに依存関係を追加しようとしています。

Gradle ドキュメントManipulating existing tasksを確認しましたが、必要な場所に依存関係を配置できません

これは私のタスクで、Android プラグインの上の$root$/myApp/build.gradleで定義されています。

task readPasswordFromInput << {
    def console = System.console()

    ext.keystorePassword = console.readLine('\n\n\n> Enter keystore password: ')
}

apply plugin: 'android'

次に、Gradle が提供する 2 つの可能性を試しました: task.dependsOntask.doFirstですが、どれも機能しません。後者は無視されているように見えますが、dependsOnは依存関係を追加しますが、依存関係チェーンでは遅すぎます。./gradlew tasks --allを実行すると、これが出力されます

:assembleRelease - Assembles all Release builds [libs:ActionBarSherlock:bundleRelease, libs:DataDroid:bundleRelease, libs:SlidingMenu:bundleRelease]
    :compileRelease
    ...
    [SEVERAL TASKS]
    ...
    :packageRelease
    ...
    [SEVERAL TASKS]
    ...
    :readPasswordFromInput

問題は、タスクpackageReleaseでキーストアのパスワードが必要なことです。

補足として、これは私が望むように機能します

buildTypes {
        release {
            def console = System.console()

            ext.keystorePassword = console.readLine('\n\n\n> IF building release apk, enter keystore password: ')

            debuggable false

            signingConfigs.release.storePassword = ext.keystorePassword
            signingConfigs.release.keyPassword = ext.keystorePassword

            signingConfig signingConfigs.release
        }
    }

ただし、クリーンアセンブルかに関係なく、gradlewを使用するたびにパスワードを要求されます

ありがとう!

編集

@Intae Kim のおかげで、ここに私の build.gradle バージョン 2.0 があります

task readPasswordFromInput << {
    def console = System.console()

    ext.keystorePassword = console.readLine('\n\n\n> Enter keystore password: ')

    android.signingConfigs.release.storePassword = ext.keystorePassword
    android.signingConfigs.release.keyPassword = ext.keystorePassword
}

tasks.whenTaskAdded { task ->
    if (task.name == 'validateReleaseSigning') {
        task.dependsOn readPasswordFromInput
    }
}

apply plugin: 'android'

次に、buildTypes

release {
    debuggable false

    signingConfig signingConfigs.release

    runProguard true
    proguardFile 'my-file.txt'
}

Gradle は正しく実行されますが、release-unsigned.apk しか生成されません

4

5 に答える 5

11

試す:

tasks.whenTaskAdded { task ->
    if (task.name == 'packageRelease') {
        task.dependsOn readPasswordFromInput
    }
}

あなたのreadPasswordFromInput仕事で。

更新しました:

このようにして、次のコードが機能することがわかります。

def runTasks = gradle.startParameter.taskNames
if ('assemble' in runTasks || 'assembleRelease' in runTasks || 'a' in runTasks || 'aR' in runTasks) {
    android.signingConfigs.releaseSign.storeFile = file('/path/to/keystore')
    android.signingConfigs.releaseSign.storePassword = System.console().readLine('KeyStore Password: ')
    android.signingConfigs.releaseSign.keyAlias = ...
    android.signingConfigs.releaseSign.keyPassword = System.console().readLine('Alias Password: ')
    android.buildTypes.release.signingConfig = android.signingConfigs.releaseSign
}

ビルドに失敗した場合は、空の keysign 構成を割り当てる必要がある場合がありますandroid.signingConfig

android {
    ...
    signingConfigs {
        releaseSign
    }
    ...
于 2013-07-05T08:24:31.397 に答える
3

私は問題なく動作するソリューションを作成しました。テストできます

android { 
    signingConfigs {
        release {
            storeFile = file('android.keystore')
            keyAlias = "my_key_alias"
        }
    }

    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }
}

task readPasswordFromInput << {
    if(!project.hasProperty('keyStore') || !project.hasProperty('keyPass') || !project.hasProperty('storePass')) {
        println "\n\$ Enter signing details manually or run with \"-PkeyStore={key.store.name} -PstorePass={StoreSecretPassword} -PkeyPass={KeySecretPassword}\""   
    }

    if(!project.hasProperty('keyStore')) {
        def newKeyStore = System.console().readLine("\n\$ Enter keystore location or enter (default: android.keystore): ")
        if(newKeyStore != '') android.signingConfigs.release.storeFile = file('${newKeyStore}')
    } else {
        android.signingConfigs.release.storeFile = file(project.keyStore)
    }

    android.signingConfigs.release.storePassword = project.hasProperty('storePass') ? project.storePass : new String(System.console().readPassword("\$ Store password: "))
        android.signingConfigs.release.keyPassword = project.hasProperty('keyPass') ? project.keyPass : new String(System.console().readPassword("\$ Key password: "))
}

tasks.whenTaskAdded { task ->
    if (task.name == 'validateReleaseSigning') {
        task.dependsOn readPasswordFromInput
    }
}

次に、プロンプトで CLI からすべての引数を渡すことができます (を使用するreadPasswordため、表示されません)、またはそれらを CLI 引数としてスクリプトに渡すことができます。

gradle assemble
gradle assemble -PkeyStore="~/.android/my.keystore"
gradle assemble -PkeyStore="~/.android/my.keystore" -PstorePass="MyStorePass"
gradle assemble -PkeyStore="~/.android/my.keystore" -PstorePass="MyStorePass" -PkeyPass="MyKeyPass"
于 2013-09-01T19:25:15.167 に答える
0

Google は最近、これを行うための公式の方法を追加しました。https://developer.android.com/studio/publish/app-signing.html#secure-shared-keystoreを参照してください。

元の質問 (パスワードを尋ねる) には答えないかもしれませんが、展開を簡素化し、資格情報を安全に保つためのより良い方法だと思います。

于 2016-08-31T14:53:50.003 に答える