2014-10-24 9 views
21

Mam i starą aplikację na Androida, którą próbuję migrować do systemu budowania gradle android. Aplikacja jest obecnie zbudowana w wielu konfiguracjach projektu i opublikowana jako cztery różne aplikacje (dwa różne zestawy danych i wersje bezpłatne/płatne dla obu zestawów danych). Udało mi się odejść od konfiguracji wielu projektów za pomocą flavorDimensions (wcześniej o nazwie flavorGroups), ale nie mogę wymyślić, jak ustawić inne ID aplikacji dla każdej kombinacji smakowej.Jak ustawić różne ID aplikacji dla każdej kombinacji środków aromatyzujących za pomocą flavorDimensions?

Ponieważ wersje aplikacji są już opublikowane, muszę zachować ten sam applicationid, jaki aktualnie posiada. Ze względu na sposób, w jaki zostało wykonane moje oryginalne nazewnictwo pakietów, nie mogę po prostu użyć kombinacji typu smak-kompozycja z "packageNameSuffix" (która byłaby świetną opcją, jeśli była to nieopublikowana aplikacja).

https://stackoverflow.com/a/20956353/4177090 odpowiada, w jaki sposób używać różnych folderów źródłowych do kombinacji smakowych, ale nie w jaki sposób (o ile jest to możliwe) ustawić określoną konfigurację dla każdej kombinacji w pliku kompilacji.

Gradle kompilacji fragment:

flavorDimensions "price", "dataset" 

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

chciałbym mieć coś jak następuje w moim Gradle plik build (zauważ jak unlogic mój nazewnictwa 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" } 
+0

Dlaczego nie porzucisz wymiarów i nie stworzysz osobnych smaków? – Simas

+0

Dziękuję za sugestię. Mógłbym to zrobić, ale w takim przypadku musiałbym skopiować foldery źródłowe smaku, tj. Dane z zestawu danych byłyby powielane zarówno do folderu freeDataset1, jak i do folderu paidDataset1. Jeśli duplikowanie kodu i danych jest moją jedyną opcją, wolałbym wrócić do korzystania z rozwiązania wielozadaniowego (niezbyt czystego, ale co najmniej lepszego niż duplikowanie zawartości mojego folderu źródłowego). – Fredrik

+0

Dlaczego połączyłeś odpowiedź sugerującą wiele folderów? – Simas

Odpowiedz

6

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

Roztwór do ustalania konkretnego applicationId dla każdego połączonego Smak

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

Proponowany Fredrik roztwór przestał działać po aktualizacji Android Studio (1.0.2 i 1.0.0 do wtyczki Gradle) tak, że miał dodaj następujące zmiany, bieżący od wtyczki 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 
    } 
} 
Powiązane problemy