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;