Подтвердить что ты не робот

Как установить различное приложение для каждой комбинации вкуса с использованием 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" }
4b9b3361

Ответ 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
    }
}