在Gradle中,是否可以基于其他构建配置字段创建布尔构建配置字段?

时间:2017-05-24 14:33:29

标签: android android-gradle

在Gradle中,如何根据其他构建配置字段创建一个布尔构建配置字段?

例如:

buildConfigField BOOLEAN, TEST_A, "false"
buildConfigField BOOLEAN, TEST_B, "false"
buildConfigField BOOLEAN, TEST_C, TEST_A && TEST_B

2 个答案:

答案 0 :(得分:7)

此代码写在您的android.defaultConfig块中,完全符合以下条件:

  buildConfigField("boolean", "TEST_A", "false");
  buildConfigField("boolean", "TEST_B", "false");
  buildConfigField("boolean", "TEST_C", "TEST_A && TEST_B");

这导致BuildConfig.java中的以下几行:

  public static final boolean TEST_A = false;
  public static final boolean TEST_B = false;
  public static final boolean TEST_C = TEST_A && TEST_B;

在以这种方式声明构建配置值时要注意一件有趣的事情,如果你看一下BuildConfig.java的结构,你可以看到在特定构建类型中声明的字段(例如android.buildTypes.debug)出现在默认配置中声明的字段之前。

因此,在提供的示例中,如果您希望TEST_C依赖于实际构建类型,则需要在构建类型级别声明TEST_ATEST_B,而不是默认级别。

答案 1 :(得分:2)

它并不漂亮,但这种方式对我有用:

android { 

    ...

    defaultConfig { 

        ...

        buildConfigField "boolean", "A", "false"
        buildConfigField "boolean", "B", "false"
        println "value of A:" + buildConfigFields.get("A").value
        println "value of B:" + buildConfigFields.get("B").value

        boolean AandB = Boolean.valueOf(buildConfigFields.get("A").value) && Boolean.valueOf(buildConfigFields.get("B").value)
        println "value of AandB:" + AandB

        buildConfigField "boolean", "C", String.valueOf(AandB);
        println "value of C:" + buildConfigFields.get("C").value
    }
}

在构建项目时,您应该在Android Studio的gradle控制台中看到它:

  

A的值:假
  B的值:假
  AandB的价值:假
  C的值:false

我相信这一点起作用的原因是因为这里defaultConfig配置闭包中的东西被委托给ProductFlavor的一个实例,它扩展了DefaultProductFlavor,扩展了包含公共方法" getBuildConfigFields"的BaseConfigImpl。

但是,我没有看到" getBuildConfigFields"正式记录为ProductFlavor上的方法,我担心它可能并不总是可供我们使用。

另请注意,buildConfigFields.get()为您提供了ClassField的实例:

public interface ClassField {
    @NonNull
    String getType();

    @NonNull
    String getName();

    @NonNull
    String getValue();

    @NonNull
    String getDocumentation();

    @NonNull
    Set<String> getAnnotations();
}

因此需要通过调用Boolean.valueOf()来获取其值并从String转换为Boolean。