Объединенные переменные BuildConfig в измерениях Gradle
В моем приложении для Android у меня есть два измерения вкуса: "бренд" (brand1, brand2) и "среда" (постановка, производство). Через некоторое время я добавил измерение "среда", и ранее я определил некоторые BuildConfig
переменные для разных брендов. Чтобы быть более конкретным, я определил BASE_URL
как это:
flavorDimensions 'brand'
productFlavors {
brand1 {
dimension 'brand'
...
buildConfigField "String", "BASE_URL", "\"http://brand.one.api/\""
...
}
brand2 {
dimension 'brand'
...
buildConfigField "String", "BASE_URL", "\"http://brand.two.api/\""
...
}
}
Теперь я добавил измерение "среда", и я хотел бы установить четыре разные конечные точки:
- Brand1-постановка: " http://brand.one.staging.api/"
- Brand1-production: " http://brand.one.production.api/"
- Brand2-постановка: " http://brand.two.staging.api/"
- Brand2-production: " http://brand.two.production.api/"
Но я не могу понять, как создать BuildConfig
переменная для конкретной комбинации размеров аромата. Это возможно даже с голым грейдером?
Спасибо
3 ответа
После некоторого дальнейшего исследования я нашел подобный вопрос здесь.
Кажется, вам нужно добавить функцию, чтобы перебрать имена вариантов сборки и проверить, соответствуют ли они некоторым нужным именам.
Моя проблема заключалась в том, что на самом деле у меня было 3 измерения: "бренд", "среда" и "API" (15 для производства и 21 для отладки с мгновенным запуском). Таким образом, название варианта будет выглядеть как brand1Api15StagingDebug, ..., brand2Api21ProductionRelease, ... и т. Д.
Здесь мне нужно было какое-то отличное сопоставление регулярных выражений в сочетании со связанным вопросом выше. Наконец, функция, которую я сделал, выглядит так:
android.applicationVariants.all { variant ->
if (variant.getName() ==~ /brand1Api[0-9]{2}Staging.*/) {
variant.buildConfigField "String", "BASE_URL", "\"http://brand.one.staging.api//\""
} else if(variant.getName() ==~ /brand1Api[0-9]{2}Production.*/){
variant.buildConfigField "String", "BASE_URL", "\"http://brand.one.production.api/\""
} else if(variant.getName() ==~ /brand2Api[0-9]{2}Staging.*/) {
variant.buildConfigField "String", "BASE_URL", "\"http://brand.two.staging.api//\""
} else if(variant.getName() ==~ /brand2Api[0-9]{2}Production.*/){
variant.buildConfigField "String", "BASE_URL", "\"http://brand.two.production.api/\""
} else {
throw new Exception("Unexpected variant name: " + variant.getName())
}
}
Я добавил исключение в конце цепочки, поэтому, если кто-либо изменит имена вариантов на непроверенные, сборка будет неудачной. Это важно, чтобы избежать создания приложений с неправильными конечными точками.
Работает как шарм.
Я сделал что-то вроде этого, сочетая вкус и марку вместе.
flavorDimensions "brand", "server"
productFlavors {
brand1 {
dimension 'brand'
...
buildConfigField "String", "BASE_URL_STAGING", "\"http://brand.one.staging.api/\""
buildConfigField "String", "BASE_URL_PRODUCTION", "\"http://brand.one.production.api/\""
...
}
brand2 {
dimension 'brand'
...
buildConfigField "String", "BASE_URL_STAGING", "\"http://brand.two.staging.api/\""
buildConfigField "String", "BASE_URL_PRODUCTION", "\"http://brand.two.production.api/\""
...
}
staging {
dimension 'server'
buildConfigField "String", "BASE_URL", 'BuildConfig.BASE_URL_STAGING'
}
production {
dimension 'server'
buildConfigField "String", "BASE_URL", 'BuildConfig.BASE_URL_PRODUCTION'
}
}
Вы можете определить одно измерение вкуса, чтобы оно имело несколько значений, чтобы позже выбрать одно конкретное значение. Сначала добавьте эти значения в ароматы:
productFlavors.all {
ext.myAnalyticsUrl = [dev: null, test: null, production: null]
}
Затем определите все значения для одного варианта:
flavor1 {
dimension "region"
myAnalyticsUrl = [
dev: *devUrl*,
test: *testUrl*,
production: *productionUrl*
]
}
dev {
dimension "environment"
...
}
test {
dimension "environment"
...
}
production {
dimension "environment"
...
}
Теперь за пределамиandroid
объем:
android.applicationVariants.all { variant ->
def regionFlavor = variant.productFlavors.find{ flavor -> flavor.getFlavorDimension() == "region" }
def environmentFlavor = variant.productFlavors.find{ flavor -> flavor.getFlavorDimension() == "environment" }
def analyticsUrl = regionFlavor.myAnalyticsUrl[environmentFlavor.name]
}
Надеюсь, поможет!