2013-07-17 11 views
19

C'è un modo per aggiungere attributi personalizzati a productFlavor o buildType nel plugin Android per gradle? Mi piacerebbe avere una maggiore flessibilità nella configurazione di buildVariants, in modo da poter controllare la mia proprietà personalizzata quando si specificano le attività per buildVariants.Gradle Android Plugin - aggiungi un attributo di sapore personalizzato?

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 
    } 

}

ecco potete vedere ho aggiunto attributo personalizzato "useWidevineAppDrmLib" per costruire sapore. Sarebbe bello vedere lo stesso attributo in buildVariant.mergedFlavor, in modo che possa verificare che il valore dell'attributo e non costruire ulteriori compiti, come pacchetto aggiuntivo file .so quando l'attributo è impostato su true:

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

forse c'è già un modo per farlo ma non ho ancora trovato ... controllare il nome della variante di compilazione per sottostringa (nome di sapore) funziona per me, ma sembra sporco.

Idealmente mi piacerebbe avere una mappa di attributi personalizzati di diversi tipi per buildType e productFlavor.

risposta

14

C'è una soluzione alternativa che non richiede la creazione di una propria classe personalizzata. È possibile utilizzare lo extras property già esistente che è già associato alla classe 'productFlavors'. Questo è stato specificamente progettato per consentire variabili definite dall'utente personalizzate.

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

Successivamente è possibile fare riferimento in questo modo. Nota, se non hai aggiunto la variabile personalizzata ad altri productFlavors, devi assicurarti di controllarla prima, altrimenti gradled lamentarsi di non aver trovato la proprietà.

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

È possibile estendere un oggetto per aggiungere una proprietà dinamicamente. Così si potrebbe fare sul oggetto sapore quando vengono aggiunti, utilizzando qualcosa di simile:

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

Tuttavia, questo non sarà possibile ottenere passato al sapore unito. Quindi dovresti farlo

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

Modificato per fare in modo che il codice funzioni effettivamente dal feedback di @ blackdigger.

+0

Xav, grazie mille per una rapida risposta! – blackdigger

+1

sono riuscito a farlo nel modo seguente: definire la classe dell'estensione sezione "Android" di cui sopra - in caso contrario dà errore di compilazione: class BooleanExtension { valore booleano BooleanExtension (valore booleano) { \t this.value = valore } pubblico setValue void (valore booleano) { \t this.value = valore } pubblico booleano getValue() { \t valore di ritorno }} quindi scrivere: widevineAppDrm { ... useWidevineAppDrmLib.v alue true ... } .... e: if (variant.productFlavors.get (0) .useWidevineAppDrmLib.value) {...} – blackdigger

+1

e una cosa di più, per aggiungere l'estensione sapore che dovevo fare: productFlavors.whenObjectAdded {sapore -> flavor.extensions.create ("useWidevineAppDrmLib", BooleanExtension, false) } – blackdigger

Problemi correlati