settings.gradle中的环境变量在Android Studio中无法工作

19

我有一个多模块项目,其中包括一个位于不同根路径下的库项目。可以将其类比为以下情况:

/projects_home/projects/app_root
   |--app/
   |   |--build.gradle
   |--build.gradle
   |--settings.gradle

/libraries_home/libraries
   |--libA
       |--build.gradle

在我的settings.gradle文件中,我可以使用projectDir属性设置库项目的绝对路径。这在控制台和Android Studio中都可以正常工作。但是,如果我尝试使用环境变量,它将无法在Android Studio中正常工作。上面示例的settings.gradle文件如下:
include ':app'
include ':libA'

project(':libA').projectDir = new File("$System.env.LIB_ROOT", '/libraries/libA')

如果我从控制台使用gradle wrapper构建,它仍然可以正常工作。但是AS停止工作并显示以下错误消息:
Gradle 'app' project refresh failed:
Configuration with name 'default' not found.

如果我取消设置环境变量,控制台上的构建将以相同的消息失败。
* What went wrong:
A problem occurred configuring project ':app'.
> Configuration with name 'default' not found.

因此,我猜AS无法访问使用我的~/.bashrc设置的环境变量。 你们中有人知道我如何使AS意识到我的环境吗?
9个回答

16

Android Studio确实会读取环境变量。您可以通过从指定了这些环境变量的 shell 中启动 Android Studio 而不是从 X 窗口面板来证明它。

您没有这些变量的原因是您使用的 X 窗口环境没有读取包含这些变量的$HOME/.bashrc文件。这是有道理的,因为bashrc是针对 Bash 而不是 X。

假设您正在使用 GNOME 或 Unity,要启动已指定这些环境变量的 Android Studio,请修改 Android Studio 的 .desktop 文件(例如,~/.local/share/applications/android-studio.desktop):

找到此行:

Exec="/home/username/tools/android/android-studio/bin/studio.sh" %f

把它改为:

Exec=env LIB_ROOT=/libraries_home "/home/username/tools/android/android-studio/bin/studio.sh" %f

注意:

此修改仅在原始命令之前添加了env LIB_ROOT=/libraries_home。您必须将username替换为您自己的用户名。

更新

如果您有任何问题,请留下评论而不是直接编辑答案。


如果我们有多个(20+)环境变量怎么办?您知道如何从某个variables.sh文件中读取所有这些变量以供Android Studio使用吗? - Mukhtar Bimurat

14

在Mac上,Android Studio似乎无法读取环境变量并用于Gradle。我认为这是此处回答中混淆的原因 - 可能在Windows上可以。

为了使Android Studio读取环境变量,我从命令行运行应用程序:

> /Applications/Android\ Studio.app/Contents/MacOS/studio 

这里的其他答案提供了除了使用环境变量之外的解决方案。对于我的情况,我正在使用一个我没有编写的库,需要使用环境变量,我宁愿不编辑他们的代码,这样以后更新会更容易。

编辑:此外,我有一个启动Android Studio的Dock图标:


非常感谢,伙计。在这上面浪费了很多时间,终于成功了。我正在使用 MacBook Pro M1 芯片笔记本电脑上的 Android Studio。Android Studio 可以读取默认的环境变量,但不能读取自定义的内容。在采纳了你的建议后,它终于可以工作了。 - Nanda Gopal
花了几天时间,我感到宽慰。谢谢。 - Dmytro Marchuk
幸运的是,这个问题现在在Bumble Bee中似乎已经解决了。 - Richard Le Mesurier
1
请查看https://dev59.com/0F0a5IYBdhLWcg3wmZzC#30128305,其中详细介绍了一种通过UI启动的应用程序传递环境变量的技术。 - CCJ
非常有用 @CCJ,谢谢! - manroe

7
尽管Scott Barta的回答是正确的,但我意识到有一种方法可以解决我的问题,并希望在这里分享,以防其他人有同样的要求。
现在,我正在使用gradle.properties文件来定义和使用gradle属性,而不是系统属性。此功能的文档可以在用户指南中找到。
现在,我原来问题的解决方案看起来像这样:
$USER_HOME/.gradle/gradle.properties:

LIB_ROOT=/libraries_home

需要修改settings.gradle文件,使用gradle属性而不是系统属性:

include ':app'
include ':libA'

project(':libA').projectDir = new File(LIB_ROOT, '/libraries/libA')

这对我来说很好用,无头模式和AS都可以。
关于我正在使用的不在一个项目根目录下的模块的更多说明。到目前为止,AS似乎没有抱怨。但是我刚开始使用这个结构,以后可能会遇到问题。我喜欢AS中更扁平的表示方式,这更像我在Eclipse中习惯的方式。
用户指南中还描述了使用gradle.properties文件设置系统属性。我也尝试过这样做,但使用环境变量时遇到了相同的问题。

将一个值放入 $USER_HOME/.gradle/gradle.properties 文件中即可替换原本需要使用环境变量的部分。感谢! - Jason Hartley
非常有用。谢谢。 - PRIHLOP

7

Android Studio不读取环境变量,因此这种方法不起作用。同时,在settings.gradle中使用projectDir方案可能会导致问题。 Android Studio有一个限制,即其所有模块都需要位于项目根目录下。如果您有在多个项目中使用的库,并且它们不能放置在单个项目根目录下,则最好的建议是将它们发布为JAR或AAR到本地Maven存储库,以便各个项目可以获取。


1
非常感谢提供的信息。由于我正在使用Git,因此我将首先尝试使用Git子模块将所有模块放在项目根目录下面。 - ckihm
只翻译文本内容:对我有效。 在Windows中设置变量。 重新启动。 $System.env.YOURVARIABLE。 - narancs
3
请检查我的答案:https://dev59.com/EmEi5IYBdhLWcg3wjc3E#27795843。"AS doesn't read env vars" 这个说法是不正确的。 - Johann Chang
那么,如何让Android Studio从环境变量中读取? - Jono

3

以下是我使用的步骤:

  1. 在Windows中设置您的变量
  2. 重新启动
  3. 在gradle build中访问它:System.env.MYVARIABLE

这就是为什么我说Android Studio确实读取环境变量的原因。 - Johann Chang
重启解决了问题 - Peddro

1

您可以通过追加方式设置环境变量:

-DYOUR_VARIABLE=variable_value

~/Library/Preferences/AndroidStudioX.X/studio.vmoptions,你可以通过从 Android Studio 菜单中选择 帮助 -> 编辑自定义 VM 选项... 来打开它。

然后你就可以像这样使用它:

System.env.YOUR_VARIABLE

build.gradlesettings.gradle 文件中。


我正在尝试使用来自~/.Androidstudio2.2/studio64.vmoptions(由AndroidStudio 2.2创建)的vmoptions。但是,当我尝试构建/同步项目的build.gradle时,构建无法获取在vmoptions中指定的变量值,导致构建失败。 - Pawan
你确定这是正确的路径吗?当你选择“帮助”->“编辑自定义VM选项”时,打开了哪个文件?你重启了Android Studio吗? - mixel
是的。当我点击 Help > Edit Custom VM Options... 时,编辑器首先要求创建新文件,然后在 IDE 中打开一个文件。这意味着我正在编辑的文件是正确的。是的,我在添加属性后已经重新启动了 Android Studio。但它没有任何效果。 - Pawan
如果我在外部构建项目(通过命令行),我只需要在执行gradle build之前使用export(Linux)属性,它就可以工作。 - Pawan
你能否提供一个带有 build.gradle 的示例项目或者单独提出问题? - mixel
我正在使用System.getenv()方法来获取值。好的,首先让我尝试一下像System.env.YOUR_VARIABLE这样的东西。如果不行,我会发一个问题。 - Pawan

1
我在安装 Android Studio 的 Bumblebee 更新后,在苹果笔记本上遇到了同样的问题。这似乎是由于 Android Studio 的某些权限问题引起的。
解决方法是添加缺失的标志:
chmod +x /Applications/Android\ Studio.app/Contents/bin/printenv

您可以查看问题跟踪器以获取更多详细信息。

谢谢,对我在搭载M1芯片的macOS Monterey上运行良好。 - jendkers

0

-1

MAC OS 更新

我确认在 Mac OS Catalina 上已经启用了环境变量。

你只需要在你正在使用的 shell 中设置它。我正在使用 zsh,并尝试设置 ~/.bash_profile,所以它没有起作用。

例如:

ZSH 配置文件

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接