tutorial temas studio productflavors now must flavors flavordimensions flavor estilos configurar belong all android gradle

temas - productflavors android studio



Gradle Android Plugin-¿Agregar atributo de sabor personalizado? (2)

¿Hay alguna manera de agregar atributos personalizados a productFlavor o buildType en el complemento de Android para gradle? Me gustaría tener esa flexibilidad adicional en la configuración de buildVariants, para que pueda verificar mi propiedad personalizada al especificar tareas para buildVariants.

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 }

}

así que aquí puedes ver que he agregado el atributo personalizado "useWidevineAppDrmLib" para crear sabor. Sería bueno ver el mismo atributo en buildVariant.mergedFlavor, de modo que pueda verificar ese valor de atributo y crear tareas adicionales, como paquetes de archivos .so adicionales cuando el atributo se establece en verdadero:

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

tal vez hay una forma de hacerlo, pero no lo descubrí ... verifcar el nombre de la variante de compilación para la subcadena (nombre del sabor) me funciona, pero parece sucio.

Idealmente, me gustaría tener un mapa de atributos personalizados de diferentes tipos para buildType y productFlavor.


Puede extender un objeto para agregar una propiedad dinámicamente. Entonces, podrías hacerlo en el objeto de sabor cuando se agreguen, usando algo como esto:

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

Sin embargo, esto no pasará al sabor combinado. Entonces tendrías que hacer

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

Editado para hacer que el código realmente funcione a partir de los comentarios de @ blackdigger.


Hay una solución alternativa que no requiere la creación de su propia clase personalizada. Puede utilizar la propiedad de extras ya existente que ya está asociada a la clase ''productFlavors''. Esto fue diseñado específicamente para permitir variables personalizadas definidas por el usuario.

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

Entonces puedes hacer referencia más tarde como así. Tenga en cuenta que si no agregó la variable personalizada a otros productFlavors, primero deberá asegurarse de verificarla, de lo contrario, gradle se quejará de no encontrar la propiedad.

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