关于buildConfigField的android gradle文档说:
void buildConfigField(String type,String name,String value)
向生成的BuildConfig类添加一个新字段。该字段生成为:type name = value;
这意味着每个必须具有有效的Java内容。如果类型是String,则该值应包含引号。
我找不到有关Arrays,Arraylist或HashMap的buildConfigField值语法的任何信息?由于它们被编译成java代码,通常一切都应该是可能的。
有没有人有一些例子或文件?
对于阵列
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;
恕我直言,使用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")
好的我现在明白了。参数在java中以1:1的形式翻译,这意味着你需要在gradle中编写java代码并正确转义。
对于HashSet:
buildConfigField "java.util.Set<String>", "MY_SET", "new java.util.HashSet<String>() {{ add(\"a\"); }};"
另一个例子
带环境的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