2017-02-14 10 views
1

私はAndroid Studio IDEを使用しています。私は、apkを実行中またはapkを生成中に入力する値を変数に割り当てる必要があります。アンドロイドスタジオのグラデルビルドでユーザーからの入力を取得

私はSystem.consoleを使用できないことを理解していますが、他の解決方法はありますか?

+0

デーモンとしてgradleを実行していない限り、 'System.console'にアクセスできるはずです。あなたのgradleコマンドに '-Dorg.gradle.daemon = false'を追加してみてください。 – drew

+0

コマンドラインからビルドしてくれてありがとうございます。私が 'System.console'をbuild.gradleで使用すると、コンソールがnullであるというエラーが発生します。 – kande

答えて

2

これはAndroid Studio内でコマンドライン入力またはスイングダイアログを使用して行うことができます。以下のサンプルタスクは、gradleがデーモンとして実行されている場合はダイアログを表示し、そうでない場合はコマンドラインプロンプトとして表示します。

import groovy.swing.SwingBuilder 

task ask << { 
    def keyPassPhrase 
    def console = System.console() 
    if (console) { 
     keyPassPhrase = console.readLine('> Please enter key pass phrase: ') 
    } else { 
     new SwingBuilder().edt { 
      dialog(modal: true, 
        title: 'Enter credentials', 
        alwaysOnTop: true, 
        resizable: false, 
        locationRelativeTo: null, 
        pack: true, 
        show: true 
     ) { 
       vbox { 
        label(text: "Please enter key passphrase:") 
        input = passwordField() 
        button(defaultButton: true, text: 'OK', actionPerformed: { 
         keyPassPhrase = input.password; 
         dispose(); 
        }) 
       } 
      } 
     } 
    } 
    print "Key pass phrase: ${keyPassPhrase}" 
} 

(グルーヴィーなソリューションhttps://www.timroes.de/2014/01/19/using-password-prompts-with-gradle-build-files/ためのティムを、Roesのおかげで)

+1

ありがとう@drew! – kande

+0

恐ろしい:)魅力のように動作します –

2

ドリューのソリューション@素晴らしいですが、それは唯一のキーストアとキーの両方のための単一のパスワードを受け入れます。私は2つの異なるパスワード、キーストアとキー用のソリューションを必要としました。

Groovyのに非常に精通していない、それは、2つの入力フィールドにこれを拡張するために、いくつかの試行錯誤を取った - ここに私がなってしまったものです:

import groovy.swing.SwingBuilder 

... 

/** 
* Ask for keystore/key passwords on the command line or popup UI 
*/ 
task askForPasswords << { 
    def console = System.console() 
    def storePw 
    def keyPw 

    if (console) { 
     // Must create String because System.readPassword() returns char[] 
     // (and assigning that below fails silently) 
     storePw = new String(console.readPassword("\nKeystore password: ")) 
     keyPw = new String(console.readPassword("Key password: ")) 
    } else { 
     // Gradle is running as a daemon - prompt user to enter passwords via popup UI 
     new SwingBuilder().edt { 
      dialog(modal: true, title: 'Enter credentials', alwaysOnTop: true, resizable: false, 
        locationRelativeTo: null, pack: true, show: true 
      ) { 
       vbox { 
        label(text: "Keystore passphrase:") 
        textField id: "storeText", input = passwordField() 
        label(text: "Key passphrase:") 
        textField id: "keyText", input = passwordField() 
        button(defaultButton: true, text: 'OK', actionPerformed: { 
         storePw = storeText.text; 
         keyPw = keyText.text; 
         dispose(); 
        }) 
       } 
      } 
     } 
    } 

    android.signingConfigs.release.storePassword = storePw 
    android.signingConfigs.release.keyPassword = keyPw 
} 

...これに似ています:

image

https://github.com/OneBusAway/onebusaway-android/blob/master/onebusaway-android/build.gradle#L291で本の実施例を参照してください。

+0

これはかなり遅いですが、実際に動作させるためにそのコードをどこに置くことができるか教えてください。 – Megakoresh

+0

https://github.com/OneBusAway/onebusaway-android/blob/master/onebusaway-android/build.gradle#L291の作業例を参照してください。 –

関連する問題