web-dev-qa-db-ja.com

Gradle buildConfigField:配列とマップの構文?

Android gradleのドキュメントにはbuildConfigFieldについて書かれています:

void buildConfigField(String type、String name、String value)

生成されたBuildConfigクラスに新しいフィールドを追加します。フィールドは次のように生成されます。typename= value;

つまり、これらのそれぞれに有効なJavaコンテンツが必要です。タイプが文字列の場合、値には引用符を含める必要があります。

Arrays、Arraylist、またはHashMapのbuildConfigField値の構文に関する情報が見つかりませんか?それらはJavaコードにコンパイルされるので、通常はすべてが可能であるはずです。

誰かがいくつかの例やドキュメントを持っていますか?

16
Fahim

アレイの場合

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;
29
Anurag Singh

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


2
Lukas

ここに別の例

環境を含むGradleファイル:

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

あなたのコードでは:

BuildConfig.API_URLS
0
Johnny Johnson

はい、わかりました。パラメータはJavaで1:1に変換されます。つまり、実際には、gradle内でJavaをコーディングし、適切にエスケープする必要があります。

HashSetの場合:


buildConfigField "Java.util.Set<String>", "MY_SET", "new Java.util.HashSet<String>() {{ add(\"a\"); }};"


0
Fahim