Как установить Различный applicationId для каждой комбинации ароматов, используя flavorDimensions?
У меня есть и старое приложение для android, которое я пытаюсь перенести в систему сборки Android gradle. Приложение в настоящее время встроено в мультипроектную установку и опубликовано в виде четырех различных приложений (два разных набора данных включены и бесплатные/платные версии для обоих наборов данных). Мне удалось уйти от настройки нескольких проектов с помощью flavorDimensions (ранее называвшихся flavorGroups), но я не могу понять, как установить другой applicationId для каждой комбинации ароматов.
Начиная с приложения версии уже опубликованы, мне нужно сохранить тот же applicationid, что и в настоящее время. Из-за того, как было сделано мое оригинальное именование пакета, я не могу просто использовать комбинацию flavor-buildtype с "packageNameSuffix" (что было бы отличным вариантом, если бы это было неопубликованное приложение).
Https://stackoverflow.com/a/20956353/4177090 отвечает, как использовать различные исходные папки для комбинаций вкусов, но не как (если это вообще возможно) установить определенную конфигурацию для каждая комбинация в файле сборки.
Фрагмент файла сборки 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" }
2 ответа:
Решение, предложенное Фредриком, перестало работать после обновления 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 } }
Мне наконец удалось решить эту проблему. Я думаю, что решение элегантное (хотя фактический код, скорее всего, может быть написан намного лучше кем-то с отличным знанием).
Решение для установки конкретного applicationId для каждого комбинированного аромата:
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" } }