Как установить Различный 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 22

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"
    }
}