Android gradleのドキュメントにはbuildConfigFieldについて書かれています:
void buildConfigField(String type、String name、String value)
生成されたBuildConfigクラスに新しいフィールドを追加します。フィールドは次のように生成されます。typename= value;
つまり、これらのそれぞれに有効なJavaコンテンツが必要です。タイプが文字列の場合、値には引用符を含める必要があります。
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;
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")
ここに別の例
環境を含む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
はい、わかりました。パラメータはJavaで1:1に変換されます。つまり、実際には、gradle内でJavaをコーディングし、適切にエスケープする必要があります。
HashSetの場合:
buildConfigField "Java.util.Set<String>", "MY_SET", "new Java.util.HashSet<String>() {{ add(\"a\"); }};"