Android studio 在android studio中获取用户对gradle构建的输入

Android studio 在android studio中获取用户对gradle构建的输入,android-studio,gradle,android-gradle-plugin,Android Studio,Gradle,Android Gradle Plugin,我使用的是Android Studio IDE,我需要在代码中指定一个变量,该变量的值将在运行apk或生成apk时输入 我知道我不能使用System.console,还有其他解决方案吗?可以使用Android Studio中的命令行输入或swing对话框来实现。如果gradle作为守护进程运行,下面的示例任务将显示一个对话框,如果不是,则显示为命令行提示符 import groovy.swing.SwingBuilder task ask << { def keyPassPhr

我使用的是Android Studio IDE,我需要在代码中指定一个变量,该变量的值将在运行apk或生成apk时输入


我知道我不能使用System.console,还有其他解决方案吗?

可以使用Android Studio中的命令行输入或swing对话框来实现。如果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}"
}
导入groovy.swing.SwingBuilder

task ask@drew的解决方案非常优秀,但它只接受密钥库和密钥的单个密码。我需要一个允许两个不同密码的解决方案,一个用于密钥库,另一个用于密钥库

由于对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
}
导入groovy.swing.SwingBuilder
...
/**
*在命令行或弹出式UI上请求密钥库/密钥密码
*/

task askForPasswords只要您不是作为守护程序运行gradle,您就应该能够访问
系统控制台。尝试将
-Dorg.gradle.daemon=false
添加到gradle命令谢谢@drew我不是从命令行生成的。如果我在build.gradle中使用
System.console
,我会得到控制台为空的错误。非常感谢@drew!如何在无头服务器上处理无法导出显示的构建?我使用的是
ant
,但最新的gradle似乎打破了这个选项。升级到android Studio 3.3后,是否有人突然停止使用
gradle-4.10.1
com.android.tools.build:gradle:3.3.0
?现在,当输入密码时,我总是得到“keystore被篡改”(即,错误的密码)提示。光标闪烁,这让我觉得它看到的是另一个来源的输入,在输入密码时会破坏密码。是的,这停止了工作。从控制台读取也是如此。现在已经很晚了,但是您能告诉我在哪里可以放置代码以使其实际工作吗?请参阅的工作示例。我尝试放置错误的凭据,但它仍在继续构建。它最终会在签名阶段失败,而签名阶段是构建的后期。