간단히 buildConfigField를 사용하기는 했는데 정말 간단했다.
buildTypes {
debug {
buildConfigField "long", "BUILD_TIMESTAMP", "0L"
manifestPlaceholders = [appName: "@string/app_name"]
}
release {
buildConfigField "long", "BUILD_TIMESTAMP", System.currentTimeMillis() + "L"
그런데 이것을 한 곳에 모았으면 좋겠다는 생각이 들었다. debug, release 모드에 따라 두 개의 값과 default 값을 정의할 수 있다.
build-config.gradle
def buildConfigList = [
["String","URL1", ["debug": "aa_d",
"release": "aa_r"]],
["boolean", "isUp", ["debug": "true",
"release": "false"]],
["String", "test1", ["default": "def1",
"release": "false"]],
]
android.applicationVariants.all { variant ->
def name = variant.getName()
buildConfigList.each { data ->
def keyType = data[0]
def keyName = data[1]
def valueMap = data[2]
def value = valueMap[name]
if (value == null) value = valueMap["default"]
if (keyType == "String") variant.buildConfigField keyType, keyName, "\"$value\""
else variant.buildConfigField keyType, keyName, "$value"
}
}
build.gradle에서 build-config.gralde을 포함시키려면
build.gradle
apply from: "build-config.gradle"
library 모듈에서도 사용할 수 있는데 libraryVariants 를 이용하면 된다.
android_base/build-config.gradle
def buildConfigList = [
["String", "URL1", ["beta": "aa_d",
"real": "aa_r"]],
["boolean", "isUp", ["beta": "true",
"real": "false"]],
["String", "test1", ["default": "def1",
"real" : "false"]],
]
android.libraryVariants.all { variant ->
def name = variant.getName()
def phase
if (name.startsWith("rc")) phase = "rc"
else if (name.startsWith("production")) phase = "real"
else phase = "beta"
print(name + "-> $phase\n")
buildConfigList.each { data ->
def keyType = data[0]
def keyName = data[1]
def valueMap = data[2]
def value = valueMap[phase]
if (value == null) value = valueMap["default"]
if (keyType == "String") variant.buildConfigField keyType, keyName, "\"$value\""
else variant.buildConfigField keyType, keyName, "$value"
}
}
https://stackoverflow.com/a/45102276
https://www.baeldung.com/groovy-maps
https://proandroiddev.com/advanced-android-flavors-part-5-the-buildconfig-strikes-back-6230ef4e0d29를 참고했습니다.