2013-07-17 12 views
19

Czy istnieje sposób na dodanie niestandardowych atrybutów do productFlavor lub buildType w dodatku dla Androida dla gradle? Chciałbym mieć taką dodatkową elastyczność w konfiguracji buildVariants, aby móc sprawdzić moją właściwość niestandardową podczas określania zadań dla buildVariants.Gradle Android Plugin - dodaj niestandardowy atrybut smaku?

productFlavors { 
    flavorGroups "drm", "storeType" 
    googlePlay { 
     flavorGroup "storeType" 
     buildConfig "public static final String TARGET_STORE = \"google\";" 
    } 
    samsungApps { 
     flavorGroup "storeType" 
     buildConfig "public static final String TARGET_STORE = \"samsung\";" 
    } 

    platformDrm { 
     flavorGroup "drm" 
    } 

    widevineAppDrm { 
     flavorGroup "drm" 
     minSdkVersion 9 
     useWidevineAppDrmLib true 
    } 

}

więc tutaj można zobaczyć Dodałem niestandardowy atrybut "useWidevineAppDrmLib" budowania smak. Byłoby miło zobaczyć ten sam atrybut w buildVariant.mergedFlavor, tak, że mogę sprawdzić, czy wartość atrybutu i budują dodatkowe zadania, takie jak pakiet dodatkowy pliki .so kiedy atrybut jest ustawiony na true:

android.applicationVariants.each { variant -> if(variant.mergedFlavor.useWidevineAppDrmLib) { ... // add copy .so task } }

Może istnieje sposób, aby to zrobić już teraz, ale nie dowiedziałem się jeszcze ... sprawdza nazwę wariantu kompilacji podłańcucha (nazwa smaku) działa dla mnie, ale wygląda na brudny.

Idealnie chciałbym mieć mapę niestandardowych atrybutów różnych typów dla buildType i productFlavor.

Odpowiedz

14

Istnieje alternatywne rozwiązanie, które nie wymaga utworzenia własnej niestandardowej klasy. Możesz użyć już istniejącego extras property, który jest już dołączony do klasy 'productFlavors'. Zostało to specjalnie zaprojektowane, aby umożliwić niestandardowe zmienne zdefiniowane przez użytkownika.

android { 
    // We can add any custom variable so long as it's prefaced with ext 
    productFlavors { 
    widevineAppDrm { 
     ext.useWidevineAppDrmLib = true 
    } 
    } 
} 

Następnie można później odwołać się tak. Uwaga: jeśli nie dodałeś zmiennej niestandardowej do innej productFlavors, musisz najpierw sprawdzić ją, inaczej gradle będzie skarżyć się, że nie znajdzie nieruchomości.

android.applicationVariants.each { variant -> 
    if (variant.productFlavors[0].ext.has("useWidevineAppDrmLib")) { 
     if (variant.productFlavors.get(0).ext.useWidevineAppDrmLib) { 
      ... 
     } 
    } 
} 
20

Można rozszerzyć obiekt, aby dynamicznie dodać właściwość. Więc można to zrobić na obiekcie smaku kiedy są dodawane za pomocą mniej więcej tak:

// First declare a class that holds a boolean 
class BooleanExtension { 
    boolean value 
    BooleanExtension(boolean value) { 
    this.value = value 
    } 

    public void setValue(boolean value) { 
    this.value = value 
    } 

    public boolean getValue() { 
    return value 
    } 
} 

android { 
    // add the boolean extension to all flavor object when they are created. 
    productFlavors.whenObjectAdded { flavor -> 
    flavor.extensions.create("useWidevineAppDrmLib", BooleanExtension, false) 
    } 

    // then we can set the value on the extension of any flavor object 
    productFlavors { 
    widevineAppDrm { 
     useWidevineAppDrmLib.value true 
    } 
    } 
} 

Jednak to nie przejdzie do połączonego smaku. Musisz więc zrobić to, aby zmienić kod tak, aby kod faktycznie działał na podstawie opinii @ blackdiggera.

+0

Xav, wielkie dzięki za szybką odpowiedź! – blackdigger

+1

udało mi się zrobić to w następujący sposób: define klasy rozszerzenie powyższej sekcji „Android” - w przeciwnym razie daje błąd kompilacji: klasa BooleanExtension { wartość logiczna BooleanExtension (wartość logiczna) { \t this.value = wartość } publicznego void setValue (wartość logiczna) { \t this.value = wartość } publicznej Boolean getValue() { \t wartość zwracana } } następnie napisać: widevineAppDrm { ... useWidevineAppDrmLib.v alue true ... } .... and: if (variant.productFlavors.get (0) .useWidevineAppDrmLib.value) {...} – blackdigger

+1

i jeszcze jedno, aby dodać rozszerzenie smaku musiałem zrobić: productFlavors.whenObjectAdded {smak -> flavor.extensions.create ("useWidevineAppDrmLib" BooleanExtension, false) } – blackdigger

Powiązane problemy