Gradle Android Plugin – agregar atributo de sabor personalizado?

¿Hay alguna manera de agregar atributos personalizados a productFlavor o buildType en el complemento android para gradle? Me gustaría tener esa flexibilidad adicional en la configuración de buildVariants, para que pueda comprobar 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í usted puede ver que he agregado el atributo de encargo "useWidevineAppDrmLib" para construir el sabor. Sería bueno ver el mismo atributo en buildVariant.mergedFlavor, para que pueda comprobar ese valor de atributo y construir tareas adicionales, como paquete de archivos adicionales .so cuando el atributo se establece en true:

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

Tal vez hay una manera de hacer eso, pero ya no me enteré aún … comprobar nombre de la variante de construcción para substring (nombre de sabor) funciona para mí, pero se ve sucio.

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

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á unida a la clase 'productFlavors'. Esto fue diseñado específicamente para permitir las 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 } } } 

A continuación, puede consultar más tarde como así. Tenga en cuenta que si no agregó la variable personalizada a otros productFlavors , deberá asegurarse de comprobar primero, 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) { ... } } } 

Puede ampliar un objeto para agregar una propiedad dinámicamente. Así que usted podría hacerlo en el objeto de sabor cuando se agregan, utilizando 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 se pasa a la fusión de sabor. Así que tendrías que hacer

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

Editado para hacer que el código realmente funcione desde la retroalimentación de @ blackdigger.

  • Definición de dependencias para múltiples variantes
  • Incremento de la versión gradle del estudio androide
  • Cómo depurar el sabor del producto en el estudio de Android?
  • Creando un archivo apk de depuración usando gradle en error de servidor sin cabeza
  • Auto incremento de código de versión sólo en versiones
  • Android Studio 0.8.2 - Falló la sincronización del proyecto de Gradle
  • Cómo depurar el módulo de la biblioteca android en Android Studio?
  • Integración con Android Studio y Protobuf
  • ¿Cómo puedo utilizar la biblioteca Permissionsdispatcher para los nuevos permisos de tiempo de ejecución de Android M?
  • Cómo importar ** algunas ** partes de la biblioteca de guayaba en la aplicación de Android (gradle)
  • Las herramientas de compilación de Android evitan que ProGuard elimine las clases de biblioteca de appcompat no utilizadas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.