Gradle buildConfigField: синтаксис для массивов и карт?
Документация android gradle говорит о buildConfigField:
void buildConfigField (String type, String name, String value)
Добавляет новое поле в сгенерированный класс BuildConfig. Поле генерируется как: type name = value;
Это означает, что каждый из них должен иметь действительный Java-контент. Если тип является строкой, то значение должно включать в себя кавычки.
Я не могу найти информацию о синтаксисе значений buildConfigField для массивов, Arraylist или HashMap? Поскольку они скомпилированы в java-код, обычно все должно быть возможно.
Есть ли у кого-нибудь примеры или документация?
Ответы
Ответ 1
Для массива
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 или выше):
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
Хорошо, теперь я понял. Параметры переведены 1:1 в Java, это означает, что на самом деле вам нужно кодировать Java в Gradle и правильно экранировать.
Для HashSet:
buildConfigField "java.util.Set<String>", "MY_SET", "new java.util.HashSet<String>() {{ add(\"a\"); }};"
Ответ 4
Еще один пример здесь
Файл Gradle со средами:
ext {
// Environments list
apiUrl = [
prod : "https://website.com",
preprod : "https://preprod.website.com"
]
}
Файл Android Gradle:
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