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

Boo*_*oon 3 android android-gradle-plugin

在Gradle中,如何基于其他构建配置字段创建布尔构建配置字段?

例如:

buildConfigField BOOLEAN, TEST_A, "false"
buildConfigField BOOLEAN, TEST_B, "false"
buildConfigField BOOLEAN, TEST_C, TEST_A && TEST_B
Run Code Online (Sandbox Code Playgroud)

Ric*_*ier 8

这个代码写在你的android.defaultConfig块中,完全是这样的:

  buildConfigField("boolean", "TEST_A", "false");
  buildConfigField("boolean", "TEST_B", "false");
  buildConfigField("boolean", "TEST_C", "TEST_A && TEST_B");
Run Code Online (Sandbox Code Playgroud)

这导致您的以下行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;
Run Code Online (Sandbox Code Playgroud)

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

因此,在所提供的示例,如果你想TEST_C依赖于实际的构建类型,你需要声明TEST_ATEST_B在构建类型级别,而不是在默认级别.


alb*_*aun 3

这并不漂亮,但这种事情对我有用:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

当您构建项目时,您应该在 Android Studio 的 gradle 控制台中看到以下内容:

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

我相信它起作用的原因是因为这里的 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();
}
Run Code Online (Sandbox Code Playgroud)

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