2017-02-14 25 views
1

我正在使用Android Studio IDE,我需要選擇在代碼中分配一個變量,並在運行apk或生成apk時輸入一個值。在Android Studio中獲取用戶輸入gradle build

據我所知,我不能使用System.console,有沒有其他解決方案?

+0

只要您沒有將gradle作爲守護進程運行,您應該可以訪問'System.console'。嘗試在您的gradle命令中添加'-Dorg.gradle.daemon = false' – drew

+0

謝謝@drew我不是從命令行構建的。如果我在build.gradle中使用'System.console',那麼控制檯爲空時會出錯。 – 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/

+1

非常感謝@drew! – kande

+0

真棒:)作品像一個魅力 –

2

@德魯的解決方案是優秀的,但只接受兩種密鑰庫和密鑰一個密碼。我需要一個允許兩個不同密碼的解決方案,一個用於密鑰庫,另一個用於密鑰。

我不是很熟悉Groovy中,它採取了一些嘗試和錯誤將其擴展到兩個輸入字段 - 這是我結束了:

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上的工作示例。 –

相關問題