我遇到了 System.getenv() 为环境变量返回 null 的问题。我的密码存储在 RELEASE_PASSWORD 环境变量中。当我这样做时:
$ echo $RELEASE_PASSWORD
它打印出正确的值,所以我知道变量已设置。
我最初在
releasebuildType 中设置
signingConfig signingConfigs.release
,一切工作正常,但我需要针对不同的产品风格使用不同的签名配置。如果我对密码进行硬编码,它就会像预期的那样工作。当我尝试从环境变量中读取密码时,事情只会变得不稳定。
是否存在某种范围问题?
这就是我目前的
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
}
}
}
您可以从命令行运行 Android Studio 以获取传递到 IDE 的环境变量。在 Mac OS 中,您可以通过运行
/Applications/Android\ Studio.app/Contents/MacOS/studio
从终端运行它
对于Windows用户,如果创建新的环境变量,则需要重新启动PC。我不知道 Windows 出了什么问题,但这就是它的工作原理。我尝试的是,在我的 gradle 脚本中,我编写了一个任务来打印我的
JAVA_HOME
变量路径,如下所示:
task printJavaHome{
println System.getenv("JAVA_HOME")
}
然后与gradle同步。
然后在 Studio 中打开终端窗口。
并输入:
gradlew -q printJavaHome
如果您设置了它,这将显示您的 java 主路径,否则它将打印
null
。
在执行上述命令之前,请确保终端指向项目的根目录。
现在尝试设置一个新的环境变量并加载它,并尝试按照上面提到的步骤打印它。如果您使用的是 Windows,您将看到 null。但是当你重新启动电脑并再次执行该命令时,它就会返回你的环境变量的实际值。
这是我的经历和想法分享,可能对某人有用。
Android Studio 不会将环境变量传递给 Gradle,因此您尝试执行的操作在 IDE 中不起作用。如果您想要一种避免将密钥库密码保留在构建文件中的方法,这里有一个答案,其中包含将其保存在单独文件中的代码:
对于我(使用 Windows)来说,只需 重新启动 Android Studio 就足够了。
Android studio 需要关闭并重新启动才能识别新更改或添加的环境变量。
出于某种原因,我认为“使缓存无效并重新启动”操作不会获取新的环境变量。我已经这样做了几次,但我认为我没有通过该操作获得新的值。这对我来说听起来很难相信,所以也许我有一些拼写错误,并且我对我所观察到的内容感到困惑;但我确实多次检查了拼写,因为这是明显的原因。在不进行任何更改的情况下,在完全关闭 android studio 后,我读取环境变量的问题就消失了,而不是执行无效缓存并重新启动操作。 我执行无效缓存并重新启动操作的原因是因为我有多个 Android Studio 会话正在进行,这似乎是关闭所有会话并重新启动它们的简单方法。
添加新的环境变量后,我使 IDE (Android Studio 4.0) 缓存失效。您可以在菜单“文件”中找到此选项。
文件 > 使缓存无效/重新启动...
您必须将环境插入到 local.properties 文件中
username="myusername"
password="mypassword"