Gradle buildConfigField:数组和映射的语法是什么?

26

Android Gradle文档中关于buildConfigField的解释:

void buildConfigField(String type, String name, String value)

向生成的 BuildConfig 类添加新字段。该字段生成为:type name = value;

这意味着每个值都必须具有有效的 Java 内容。如果类型是字符串,则值应包含引号。

我找不到关于 Arrays、ArrayList 或 HashMap 的 buildConfigField 值语法的任何信息?由于它们通常编译为 Java 代码,因此应该可以实现任何功能。

是否有人有一些示例或文档?


这是Groovy代码。因此,如果您想了解语法,请查看那里。 - OneCricketeer
1
这不是关于Groovy语法的问题,更多地涉及可用类型。但是我在此期间解决了这个问题... - Fahim
5个回答

50

对于数组

app.gradle

        buildConfigField "String[]", "URL_ARRAY",
        "{" +
        "\"http:someurl\"," +
        "\"http:someurl\"," +
        "\"http:someurl\"" +
        "}"

用于Map操作

        buildConfigField "java.util.Map<String, String>", "NAME_MAP", 
                 "new java.util.HashMap<String, " +
                 "String>() {{ put(\"name\", \"John\"); put(\"name1\",  \"John\"); put(\"name2\", " +
                "\"John\"); }}"

在代码中访问:

HashMap<String, String> name = (HashMap<String, String>) BuildConfig.NAME_MAP;

3

这里有另一个例子

带有环境的Gradle文件:

ext {
    // Environments list
    apiUrl = [
            prod         : "https://website.com",
            preprod      : "https://preprod.website.com"
    ]
}

Gradle Android文件:

private static String getApiUrlHashMapAsString(apiUrlMap) {
    def hashMap = "new java.util.HashMap<String, String>()" + "{" + "{ "
    apiUrlMap.each { k, v -> hashMap += "put(\"${k}\"," + "\"${v}\"" + ");" }
    return hashMap + "}" + "}"
}

android {
    defaultConfig {
         buildConfigField "java.util.Map<String, String>", "API_URLS", getApiUrlHashMapAsString(apiUrl)
    }
}

在你的代码中:
BuildConfig.API_URLS

3

在我看来,使用 buildConfig 字段的原因是将重要数据从代码中分离出来,例如环境变量。

另一个例子-静态数组+ gradle.properties(需要Gradle 2.13或更高版本):

gradle.properties:


nonNullStringArray=new String[]{ \n\
    \"foo\",\n\
    \"bar\"\n}

build.gradle:

buildConfigField "String[]", "nonNullStringArray", (project.findProperty("nonNullStringArray") ?: "new String[]{}")

buildConfigField "String[]", "nullableStringArray", (project.findProperty("nullableStringArray") ?: "null")



3

无需转义的数组快捷方法:

def arrayAsString(String ... args) {
    StringBuilder builder = new StringBuilder();
    builder.append("{");
    if(args.length > 0) {
        for (String arg : args) {
            builder.append('"')
            builder.append(arg);
            builder.append('"')
            builder.append(", ")
        }
        builder.setLength(builder.length() - 2)
    }
    builder.append("}");
    return builder.toString();
}

0

好的,我现在明白了。参数在Java中是一对一翻译的,这意味着实际上你需要在Gradle中编写Java并进行适当的转义。

对于HashSet:


buildConfigField "java.util.Set<String>", "MY_SET", "new java.util.HashSet<String>() {{ add(\"a\"); }};"



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