2013-07-17 16 views
19

Gibt es eine Möglichkeit, benutzerdefinierte Attribute zu ProductFlavor oder BuildType in Android-Plugin für Gradle hinzuzufügen? Ich hätte gerne eine solche zusätzliche Flexibilität bei der Konfiguration von BuildVariants, damit ich meine benutzerdefinierte Eigenschaft beim Festlegen von Aufgaben für BuildVariants überprüfen kann.Gradle Android Plugin - benutzerdefinierte Flavor-Attribut hinzufügen?

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 
    } 

}

so hier können Sie sehen, ich benutzerdefinierte Attribute hinzugefügt haben "useWidevineAppDrmLib" Geschmack zu bauen. Es wäre schön, das gleiche Attribut in buildVariant.mergedFlavor, um zu sehen, so dass ich diesen Attributwert überprüfen und bauen zusätzliche Aufgaben, wie zum Beispiel Paket zusätzliche .so-Dateien, wenn das Attribut auf true gesetzt ist:

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

vielleicht gibt es einen Weg, das schon zu tun, aber ich habe noch nicht herausgefunden ... Überprüfung Build-Variante Name für Teilzeichenfolge (Flavor Name) funktioniert für mich, aber es sieht schmutzig aus.

Idealerweise hätte ich gerne eine Karte von benutzerdefinierten Attributen verschiedener Typen für BuildType und ProductFlavor.

Antwort

14

Es gibt eine alternative Lösung, die nicht die Erstellung einer eigenen benutzerdefinierten Klasse erfordert. Sie können das bereits vorhandene extras property verwenden, das bereits an die Klasse 'productFlavors' angehängt ist. Dies wurde speziell entwickelt, um benutzerdefinierte benutzerdefinierte Variablen zu ermöglichen.

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

Dann können Sie später wie folgt referenzieren. Hinweis: Wenn Sie die benutzerdefinierte Variable nicht zu einem anderen productFlavors hinzugefügt haben, müssen Sie sicherstellen, dass Sie zuerst danach suchen. Andernfalls wird sich die Gruppe beschweren, dass sie die Eigenschaft nicht findet.

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

Sie können ein Objekt erweitern, um eine Eigenschaft dynamisch hinzuzufügen. So könnte man es auf den Geschmack Objekt tun, wenn sie noch hinzukommen, so etwas wie dies mit:

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

Dies wird jedoch nicht auf die fusionierte Geschmack übergeben bekommen. Sie müssten also

android.applicationVariants.each { variant -> 
    if (variant.productFlavors.get(0).useWidevineAppDrmLib.value) { 
    ... 
    } 
} 

bearbeitet werden, um den Code tatsächlich von @ blackdigger Feedback arbeiten zu lassen.

+0

Xav, vielen Dank für die schnelle Antwort! – blackdigger

+1

Ich schaffte es die folgende Art und Weise zu tun: Erweiterungsklasse oben "android" Abschnitt definieren - sonst gibt es kompilieren Fehler: Klasse BooleanExtension { Booleschen Wert BooleanExtension (Boolean value) { \t this.value = Wert } Öffentlichkeit void setValue (Boolean value) { \t this.value = Wert } public Boolean getValue() { \t Rückgabewert } } dann schreiben: widevineAppDrm { ... useWidevineAppDrmLib.v alue true ... } .... und: if (variant.productFlavors.get (0) .useWidevineAppDrmLib.value) {...} – blackdigger

+1

und eine weitere Sache, Geschmackserweiterung hinzufügen ich zu tun hatte: productFlavors.whenObjectAdded {Geschmack -> flavor.extensions.create ("useWidevineAppDrmLib", BooleanExtension, false) } – blackdigger

Verwandte Themen