Jak ustawić różne zastosowania dla każdej kombinacji smakowej za pomocą flavorDimensions?

Mam i starą aplikację na Androida, którą próbuję przenieść do systemu Android gradle build. Aplikacja jest obecnie zbudowana w konfiguracji wielu projektów i opublikowane jako cztery różne aplikacje (dwa różne zestawy danych zawarte i darmowe / płatne wersje dla obu zestawów danych). Udało mi się uciec od konfiguracji wielu projektów, używając flavorDimensions (wcześniej nazywanych flavorGroups), ale nie mogę wymyślić, jak ustawić inną aplikację dla każdej kombinacji smakowej.

Ponieważ aplikacja wersje są już opublikowane, muszę zachować tę samą aplikację co obecnie. Ze względu na sposób, w jaki moje oryginalne nazewnictwo pakietów zostało zrobione, nie mogę po prostu użyć kombinacji flavor-buildtype z "packageNameSuffix" (co byłoby świetną opcją, gdyby była to nieopublikowana aplikacja).

Https://stackoverflow.com/a/20956353/4177090 odpowiada, jak używać różnych folderów źródłowych dla kombinacji smakowych, ale nie jak (jeśli to możliwe) ustawić konkretną konfigurację dla każda kombinacja w pliku budowania.

Fragment pliku Gradle build:

flavorDimensions "price", "dataset"

productFlavors {
    free { flavorDimension "price" }
    paid { flavorDimension "price" }
    dataset1 { flavorDimension "dataset" }
    dataset2 { flavorDimension "dataset" }
}

Chciałbym mieć coś takiego w moim Gradle build file (zauważ jak unlogic moje nazewnictwo jest, dlatego nie mogę używać packageNameSuffix):

freeDataset1 { applicationId "com.beansys.freeappdataset1" }
freeDataset2 { applicationId "com.beansys.freedataset2" }
paidDataset1 { applicationId "com.beansys.dataset1paid" }
paidDataset2 { applicationId "com.beansys.mypaiddataset2" }
Author: Community, 2014-10-24

2 answers

Rozwiązanie zaproponowane przez Fredrika przestało działać po aktualizacji Android Studio do 1.0.2 (i Gradle plugin do 1.0.0) więc musiałem dodać następujące zmiany, aktualne od Gradle plugin 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
    }
}
 21
Author: Iwo Banas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-25 20:24:05

W końcu udało mi się to rozwiązać. Myślę, że rozwiązanie jest eleganckie (chociaż rzeczywisty kod mógłby być napisany o wiele ładniej przez kogoś z groovy wiedzy).

Roztwór do ustawiania specyficznej aplikacji dla każdego połączonego smaku:

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"
    }
}
 6
Author: Fredrik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-27 10:14:09