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

问题描述 投票:12回答:3

关于buildConfigField的android gradle文档说:

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

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

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

我找不到有关Arrays,Arraylist或HashMap的buildConfigField值语法的任何信息?由于它们被编译成java代码,通常一切都应该是可能的。

有没有人有一些例子或文件?

java android gradle android-gradle
3个回答
25
投票

对于阵列

app.gradle

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

对于地图

        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;

2
投票

恕我直言,使用buildConfig字段的原因是将重要数据保留在代码之外 - 就像环境变量一样。

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

grad了.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")



0
投票

好的我现在明白了。参数在java中以1:1的形式翻译,这意味着你需要在gradle中编写java代码并正确转义。

对于HashSet:


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



0
投票

另一个例子

带环境的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
© www.soinside.com 2019 - 2024. All rights reserved.