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