Android gradle build System.getEnv( "RELEASE_PASSWORD" ) возвращает null
У меня возникают проблемы, когда System.getenv() возвращает значение null для переменной среды. Мой пароль хранится в переменной среды RELEASE_PASSWORD. Когда я это сделаю:
$ echo $RELEASE_PASSWORD
он выводит правильное значение, поэтому я знаю, что переменная установлена.
Я изначально устанавливал signingConfig signingConfigs.release
в release buildType, и все работало нормально, но мне нужны разные подписи для разных продуктов. Если я жестко программирую пароль, он работает так же, как и предполагается. Когда я пытаюсь прочитать пароль из переменной окружения, ситуация становится нестабильной.
Это какая-то проблема в области видимости?
Это то, что у меня есть в моем build.gradle
.
android {
...
signingConfigs {
release {
storeFile ...;
keyAlias ...;
storePassword System.getenv("RELEASE_PASSWORD");
keyPassword System.getenv("RELEASE_PASSWORD");
}
unsigned {
keyAlias "";
storePassword "";
keyPassword "";
}
}
buildTypes {
debug {
versionNameSuffix = "-DEBUG"
}
release {
}
}
flavorGroups "storeFront"
productFlavors {
def googleVariable = signingConfigs.release
def amazonVariable = signingConfigs.unsigned
google {
flavorGroup "storeFront"
signingConfig googleVariable
}
amazon {
flavorGroup "storeFront"
signingConfig amazonVariable
}
}
}
Ответы
Ответ 1
Android Studio не передает переменные среды в Gradle, поэтому то, что вы пытаетесь сделать, не будет работать из среды IDE. Если вы хотите избежать сохранения пароля хранилища ключей в файле сборки, вот ответ с кодом для его сохранения в отдельном файле:
Подпишите APK, не помещая информацию в хранилище в файле build.gradle
Ответ 2
Для пользователя Windows, если вы создаете новую переменную среды, вам необходимо перезагрузить компьютер. Я не знаю, что не так с Windows, Но как это работает на нем. То, что я пробовал, в моем gradle script я написал задачу для печати моего пути JAVA_HOME
, как это:
task printJavaHome{
println System.getenv("JAVA_HOME")
}
а затем синхронизируется с gradle.
Затем откройте окно терминала в своей студии.
и введите:
gradlew -q printJavaHome
Это покажет ваш домашний путь java, если вы установите его, иначе он напечатает null
.
и перед выполнением вышеуказанной команды убедитесь, что терминал указан в корневой директории проекта.
Теперь попробуйте установить новую переменную среды и загрузить ее и попытаться распечатать ее, как указано выше. Вы увидите нуль, если используете Windows. Но когда вы перезагрузите компьютер и снова выполните команду, он вернет текущее значение переменной среды.
То, что я испытал и думал о совместном использовании, может быть полезно для кого-то.
Ответ 3
Вы можете запустить Android Studio из командной строки, чтобы получить переменные среды, переданные в среду IDE. В Mac OS вы можете запустить его с терминала, запустив /Applications/Android\ Studio.app/Contents/MacOS/studio
Ответ 4
Для меня (с использованием Windows) достаточно было просто перезапустить Android Studio.
Ответ 5
Вот что я обнаружил об использовании переменных среды при работе с градиентом в ОС Windows:
переменная пользовательской среды:
key: ANDROID_COMPILE_SDK_VERSION value: 28
системная переменная среды:
key: AndroidSDK value: C:\Users\tom\AppData\Local\Android\sdk
в сценарии градации:
println System.getenv("ANDROID_COMPILE_SDK_VERSION")
println System.getenv("AndroidSDK")
Результат скрипта gradle (версия градиента, которую я использую - 4.6):
null
C:\Users\tom\AppData\Local\Android\sdk
Это наблюдение говорит о том, что градиент "System.getenv" работает только для получения переменных системной среды, а не переменных среды пользователя. Этот счетчик интуитивно понятен тому, как переменные среды работают в ОС Windows. Хотя я и не пробовал, я бы предположил, что значение переменной среды PATH включает только переменную среды "система" PATH и не объединяет переменную среды PATH пользователя в результате для System.getenv("Путь")
Ответ 6
Студию Android нужно закрыть и перезапустить, чтобы распознать новые измененные или добавленные переменные среды.
По какой-то причине я не думаю, что операция "Invalidate Cache and restart" подбирает новые переменные среды. Я сделал это пару раз, и я не думаю, что получил новые ценности, делающие эту операцию. Мне это трудно поверить, поэтому, возможно, у меня была некоторая опечатка, и я смущен тем, что я наблюдал; но я проверял орфографию несколько раз, потому что это очевидная причина. Без каких-либо изменений проблема, с которой я столкнулась, изменила переменные окружения после того, как полностью закрыла студию Android, а не выполняла операцию Invalidate Cache и перезапуска. Причина, по которой я сделал операцию Invalidate Cache и перезагрузки, состояла в том, что у меня было несколько сеансов Android Studio, и это похоже на простой способ закрыть их все и перезапустить их.