Как установить различное приложение для каждой комбинации вкуса с использованием flavorDimensions?
У меня есть и старое приложение для Android, которое я пытаюсь перенести на систему сборки android gradle. Приложение в настоящее время построено в нескольких проектах и опубликовано в виде четырех различных приложений (два разных набора данных включены и бесплатные/платные версии для обоих наборов данных). Мне удалось уйти от настройки нескольких проектов, используя flavorDimensions (ранее называемые flavorGroups), но я не могу понять, как установить другое приложение для каждой комбинации вкуса.
Поскольку версии приложений уже опубликованы, мне нужно сохранить тот же applicationid, что и в настоящее время. Из-за того, как было выполнено мое первоначальное имя пакета, я не могу просто использовать комбинацию flavor-buildtype с "packageNameSuffix" (что было бы отличным вариантом, если это было неопубликованное приложение).
qaru.site/info/250937/... отвечает, как использовать разные исходные папки для комбинаций вкуса, но не как (если вообще возможно) установить определенную конфигурацию для каждой комбинации в сборке файл.
Gradle фрагмент файла сборки:
flavorDimensions "price", "dataset"
productFlavors {
free { flavorDimension "price" }
paid { flavorDimension "price" }
dataset1 { flavorDimension "dataset" }
dataset2 { flavorDimension "dataset" }
}
Я хочу иметь что-то вроде следующего в моем файле сборки gradle (обратите внимание, как нелогично мое именование, поэтому я не могу использовать packageNameSuffix):
freeDataset1 { applicationId "com.beansys.freeappdataset1" }
freeDataset2 { applicationId "com.beansys.freedataset2" }
paidDataset1 { applicationId "com.beansys.dataset1paid" }
paidDataset2 { applicationId "com.beansys.mypaiddataset2" }
Ответы
Ответ 1
Наконец-то мне удалось это решить. Я думаю, что решение элегантно (хотя реальный код, скорее всего, будет написан намного лучше кем-то с знанием groovy).
Решение для установки конкретного приложения для каждого комбинированного вкуса:
flavorDimensions "price", "dataset"
productFlavors {
free { flavorDimension "price" }
paid { flavorDimension "price" }
dataset1 { flavorDimension "dataset" }
dataset2 { flavorDimension "dataset" }
}
android.variantFilter { variant ->
def flavorString = ""
def flavors = variant.getFlavors()
for (int i = 0; i < flavors.size(); i++) {
flavorString += flavors[i].name;
}
if(flavorString.equalsIgnoreCase("freeDataset1")) {
variant.getDefaultConfig().applicationId "com.beansys.freeappdataset1"
}
if(flavorString.equalsIgnoreCase("freeDataset2")) {
variant.getDefaultConfig().applicationId "com.beansys.freedataset2"
}
if(flavorString.equalsIgnoreCase("paidDataset1")) {
variant.getDefaultConfig().applicationId "com.beansys.dataset1paid"
}
if(flavorString.equalsIgnoreCase("paidDataset2")) {
variant.getDefaultConfig().applicationId "com.beansys.mypaiddataset2"
}
}
Ответ 2
Решение, предложенное Fredrik, прекратило работу после обновления Android Studio до 1.0.2 (и gradle плагина до 1.0.0), поэтому мне пришлось добавить следующие изменения: текущий с gradle плагин 1.3.1:
flavorDimensions "price", "dataset"
productFlavors {
free { dimension "price" }
paid { dimension "price" }
dataset1 { dimension "dataset" }
dataset2 { dimension "dataset" }
}
android.applicationVariants.all { variant ->
def mergedFlavor = variant.mergedFlavor
switch (variant.flavorName) {
case "freeDataset1":
mergedFlavor.setApplicationId("com.beansys.freeappdataset1")
break
case "freeDataset2":
mergedFlavor.setApplicationId("com.beansys.freedataset2")
break
case "paidDataset1":
mergedFlavor.setApplicationId("com.beansys.dataset1paid")
break
case "paidDataset2":
mergedFlavor.setApplicationId("com.beansys.mypaiddataset2")
break
}
}