settings.gradle中的环境variables不适用于Android Studio

我有一个多模块项目,其中一个库项目位于不同的根路径中。 如图所示,您可以想象如下:

/projects_home/projects/app_root |--app/ | |--build.gradle |--build.gradle |--settings.gradle /libraries_home/libraries |--libA |--build.gradle 

在我的settings.gradle文件中,我可以使用projectDir属性设置库项目的绝对路径。 这在控制台和Android Studio中都可以正常工作。

但是,如果我尝试使用环境variables,它将停止使用Android Studio。 上面示例的settings.gradle如下所示:

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

如果我使用控制台中的graddle包装器构建,它仍然有效。 但AS停止使用以下错误消息:

 Gradle 'app' project refresh failed: Configuration with name 'default' not found. 

如果我取消设置环境variables,则控制台上的构建将失败并显示相同的消息:

 * What went wrong: A problem occurred configuring project ':app'. > Configuration with name 'default' not found. 

因此,我猜AS在某种程度上无法访问使用〜/ .bashrc设置的环境variables

你们中的某些人是否知道如何让AS了解我的环境?

  • Android AutoCompleteTextViewpopup窗口显示后移动
  • Android Studio,Locat显示无限的“I / art:Enter while loop。”,即使在运行Empty Activity时也是如此
  • 按钮按钮= findViewById(R.id.button)在Android Studio中始终解析为null
  • 在Android Studio / Intellij中自动生成Android Log TAG
  • 使用新的kotlin 1.1构建错误,kapt cant parse databinding params
  • 使用Gradle Android构建系统指定测试依赖项
  • Android Studio无法构建新项目,在使用slave aapt进程时超时
  • 通过ClipData.Item.getUri暴露在app之外
  • Android Studio不读取环境variables,因此这种方法不起作用。 此外,在settings.gradle中使用projectDir方案可能会导致问题。 Android Studio有一个限制,即所有模块都需要位于项目根目录下。 如果您有多个项目中使用的库并且它们不能放在单个项目根目录下,那么最好的建议是让它们将JAR或AAR发布到单个项目可以获取的本地Maven存储库。

    Android Studio 确实读取了环境variables。 你可以通过从那些env的shell启动Android Studio来certificate它。 指定variables而不是X-window仪表板。

    您没有这些variables的原因是您使用的X-window环境没有读取包含这些variables的$HOME/.bashrc 。 这是有道理的,因为bashrc适用于Bash而不是X.

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

    find这一行:

     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

    更新

    如果您有任何疑问,请先发表评论,而不是直接编辑答案。 特别是,我不知道如何联系编辑。

    尽管斯科特巴塔的答案是正确的,但我意识到有一种方法可以解决我的问题,并且如果其他人有相同的要求,我不想分享这个问题。

    我现在使用gradle.properties文件来定义和使用gradle属性而不是系统属性。 此function的文档可以在用户指南中进行处理

    我原来问题的解决方案现在看起来像这样:

     $USER_HOME/.gradle/gradle.properties: LIB_ROOT=/libraries_home 

    必须修改settings.gradle文件以使用gradle属性而不是system属性:

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

    这对我来说很好,无头以及AS。

    关于我正在处理未放置在一个项目根目录下的模块这一事实的更多说法。 直到现在看起来AS并没有抱怨这一点。 但我刚开始使用这种结构,可能会在以后遇到问题。 我喜欢这个是AS中更平坦的表示,更像是我习惯用Eclipse。

    用户指南中还描述了使用gradle.properties文件设置系统属性。 我也尝试了这个,但我确实遇到了使用环境variables的AS相同的问题。

    在Mac上,Android Studio显然不会读取Gradle中使用的环境variables。 我相信这是在这里答案混淆的原因 – 也许它在Windows上。

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

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

    这里的其他答案提供除使用环境variables之外的解决方案。 对于我的情况,我使用的是一个我没写过的库,需要使用环境variables,而我宁愿不编辑它们的代码,以便以后更容易更新。

    编辑:而且,我有一个停靠图标以这种方式启动Android Studio: https : //superuser.com/a/260712/501568解释了如何。

    它适用于我,具有以下步骤:

    1. 在Windows中设置variables
    2. 重启
    3. 在gradle build中访问它: System.env.MYVARIABLE

    您可以通过附加来设置环境variables:

     -DYOUR_VARIABLE=variable_value 

    通过从Android Studio菜单中选择帮助 – >编辑自定义VM选项…来打开~/Library/Preferences/AndroidStudioX.X/studio.vmoptions

    然后你可以使用它:

     System.env.YOUR_VARIABLE 

    build.gradlesettings.gradle中