Gradle buildConfigField: Syntax for arrays & maps?

Convenience method for arrays (without escaping):

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();
}

Another example here

Gradle file with environments :

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

Gradle Android file :

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)
    }
}

In your code :

BuildConfig.API_URLS

IMHO the reason for using buildConfig fields is to keep important data out of the code - like environment variables.

another example - static arrays + gradle.properties (requires Gradle 2.13 or above):

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")



For array

app.gradle

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

For Map

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

Access in code:

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