2014-10-28 11 views
8

Mam stosunkowo skomplikowany projekt, który wymaga dwóch wymiarów smakowych dla każdej aplikacji. Mam przepisany go znacznie prościej w poniższym przykładzie:Gradle: Aplikacja o wielowymiarowym smaku ApplicationId

flavorDimensions "shape", "color" 

productFlavors { 

    blue { 
     flavorDimension "color" 
    } 

    red { 
     flavorDimension "color" 
    } 

    green { 
     flavorDimension "color" 
    } 


    square { 
     flavorDimension "shape" 
    } 

    circle { 
     flavorDimension "shape" 
    } 

Chcę móc ustawić inny applicationId dla każdego wariantu, np squareblue miałoby inny applicationId do circleblue. Nie mogę ustawić elementu applicationId w wymiarze koloru, ponieważ byłby taki sam dla każdego kształtu. W powyższym przykładzie potrzebowałbym 6 różnych identyfikatorów aplikacji. Te identyfikatory również nie podążają za żadnym wzorem, mogą być dowolne.

Widziałem odpowiedź tutaj: How to set different applicationId for each flavor combination using flavorDimensions?, ale to oznaczałoby, muszę ustawić ręcznie, co nie jest możliwe do mojego projektu, ze względu na liczbę wariantów (1000).

Co naprawdę chcę zrobić, to ustawić dwa applicationids na wymiarze koloru, a następnie wybiera właściwy, w zależności od wymiaru kształtu, kiedy jest zbudowany. Próbowałem definiować zmienne, ale nie odniosłem żadnego sukcesu, po prostu zostają nadpisane przez ostatni wariant.

+1

Pliki kompilacji są napisane w Turing-kompletnego języku, więc masz potencjał, aby zrobić całkiem sporo. Nie możesz oprzeć się na kodzie w tym pytaniu, z którym się łączyłeś i dodać własną logikę do generowania identyfikatorów aplikacji? –

+0

Identyfikatory ApplicationID są już istniejące i mogą być dowolne, więc nie ma logicznego sposobu ich tworzenia. Mogłabym dodać każdą z nich w wariancieFilter, ale wymagałoby to dodania tysięcy dodatkowych linii do mojego pliku gradle, aby sprawdzić każdy wariant. –

+0

Jeśli nie ma logicznego sposobu ich tworzenia, nie jestem pewien, jaka jest rozsądna alternatywa - musisz gdzieś je zakodować. Możesz prawdopodobnie zapisać je w pliku tekstowym CSV i napisać kod w pliku kompilacji, aby odczytać go na mapie i zastosować. –

Odpowiedz

0

znalazłem rozwiązanie wynikające z tego przykładu tutaj: Gradle Android Plugin - add custom flavor attribute?

Jeśli dodać klasę tak do Gradle plik można dodać niestandardowe atrybuty do productFlavor

class AppIdExtension { 
    String squareId 
    String circleId 

    AppIdExtension(String sId, String cId){ 
     squareId = sId 
     circleId = cId 
    } 

    public void setSquareId(String id){ 
     squareId = id 
    } 

    public String getSquareId(){ 
     squareId 
    } 

    public void setCircleId(String id){ 
     circleId = id 
    } 

    public String getCircleId(){ 
     circleId 
    } 

} 

Następnie dodać do tego rozszerzenie do każdego smaku dodając następujący kod na początku sekcji android { }

productFlavors.whenObjectAdded { flavor -> 
    flavor.extensions.create("shapeIds", AppIdExtension, "", "") 
} 

Następnie wewnątrz swojej produkcji kie t smak można ustawić wartości dla każdego typu kształtu

blue { 
     flavorDimension "color" 
     platformIds.squareId "yourAppId" 
     platformIds.circleId "yourAppId" 
    } 

wreszcie po sekcji productFlavors { } dodać następujące:

android.variantFilter { variant -> 
    def applicationId = "" 
    def flavors = variant.getFlavors() 

    if(flavors[0].name.equals("square")){ 
     applicationId = flavors[1].platformIds.squareId 
    } else if(flavors[0].name.equals("circle")){ 
     applicationId = flavors[1].platformIds.circleId 
    } 

    variant.getDefaultConfig().applicationId applicationId 

} 

To może nie być najbardziej elegancki i skuteczny sposób na osiągnięcie tego, ale działa to doskonale dla mnie. Teraz mogę dodać wszystkie moje identyfikatory w sekcji productFlavor, a następnie variantFilter ustawia poprawny identyfikator aplikacji w zależności od pierwszego smaku.

+0

Dodawanie rozszerzenia "per-flavour" brzmi jak dobre rozwiązanie. (Powinny też zadziałać dodatkowe właściwości smaku.) Zamiast 'productFlavors.whenObjectAdded {...}' możesz/powinieneś używać 'productFlavors.all {...}'. –

0

Wbudowane oprogramowanie Gradle ma wbudowane extras property, więc można to zrobić bez definiowania klasy.

wyglądałby mniej więcej tak, mógł popełnił literówkę lub dwa:

productFlavors { 
    blue { 
     flavorDimension "color" 
     ext.squareId = "yourAppId" 
     ext.circleId = "yourAppId" 
    } 

    android.applicationVariants.all { variant -> 
     def flavors = variant.getFlavors() 
     if (flavors[0].name.equals("square")){ 
      variant.mergedFlavor.setApplicationId(flavors[1].ext.squareId) 
     } ... 
    } 
0
def appId = "my.custom.package" 

if (appId == "some.package") { 
    ..... Change conditions based on the flavors maybe defined more variables 
} 

defaultConfig { 
     applicationId "${appId}" 
     ............... 
} 
Powiązane problemy