如何从java模块中的gradle.properties读取值?

时间:2016-02-18 01:09:44

标签: java android gradle android-gradle gradle-plugin

我在Android Studio中有一个带有几个模块的项目。

  • app模块。使用apply plugin: 'com.android.application'
  • androidLibrary模块。使用apply plugin: 'com.android.library'
  • javaLibrary模块。使用apply plugin: 'java'

我想在项目gradle.properties文件中声明一些变量,并能够从javaLibrary模块中读取它们。

我已根据this文档......

以下列方式声明属性
  • mysuperhost=superhost
  • systemProp.mysuperhost=superhost
  • ORG_GRADLE_PROJECT_mysuperhost=superhost
  • org.gradle.project.mysuperhost=superhost

...并尝试以这种方式阅读它们但没有成功:

  • System.getenv("mysuperhost");
  • System.getProperty("mysuperhost");

我知道如何从BuildConfig类中读取属性,但这是app模块中的生成类(带apply plugin: 'com.android.application'),因此这不适用于此特定情况。

2 个答案:

答案 0 :(得分:4)

如果您的 gradle.properties 文件中有一些值,例如 的 mysuperhost = superhost 然后在 build.gradle 文件中写下以下行(从 gradle.properties 文件中获取属性并将其添加到 BuildConfig.java 类中):

// ...
// ...

android {
    // Just for example
    compileSdkVersion 23
    // Just for example
    buildToolsVersion "23.0.2"

    // ...
    // ...

    defaultConfig {
        // Just for example
        minSdkVersion 14
        // Just for example
        targetSdkVersion 23

        // This is the main idea
        buildConfigField('String', 'MY_SUPER_HOST', "\"${mysuperhost}\"")

        // ...
        // ...
    }

    // ...
    // ...
}

// ...
// ...

在构建项目之后,您可以通过 BuildConfig.MY_SUPER_HOST

来使用您的价值

答案 1 :(得分:1)

关于无法使用BuildConfig的声明并不完全准确,因为只要您知道其完全限定的包,就可以使用Java反射来查找BuildConfig的公共静态成员。

假设生成的BuildConfig的完整包名是com.company.app.BuildConfig。您可以使用以下命令获取其Class对象:

Class<?> klass = Class.forName("com.company.app.BuildConfig");

然后您可以使用该Class对象按名称选择它的字段:

Field field = klass.getDeclaredField("BUILD_TYPE");

然后你可以得到它的价值:

String value = field.get(null);