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 }
}
- No se pudo encontrar la propiedad 'xxxx' en com.android.build.gradle.AppExtension_Decorated
- Dependencia de ViewPagerIndicator con Gradle y Android Studio
- ¿Cómo crear un proyecto android con gradle desde la línea de comandos?
- ¿Puede un AAR incluir dependencias transitivas?
- Dagger 2 y Android Data Binding conflict
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.
- ¿Cómo puedo conseguir que mi app.iml se mantenga estable en la reconstrucción del proyecto Android Studio?
- Dependencia de la biblioteca de Android Gradle con la dependencia de la biblioteca mediante Nexus
- ¿Cómo apuntamos androidTest a un Peer Eclipse-Style Project?
- Java.lang.UnsatisfiedLinkError - NDK en el nivel de estudio de Android?
- Android - Errores de entrada de zip de Proguard duplicados - Biblioteca de soporte de Android
- No se puede actualizar build.gradle para usar la biblioteca de soporte 23.0.1
- Cómo importar el proyecto android como biblioteca y NO compilarlo como apk (Android studio 1.0)
- ¿Es obligatorio usar Gradle con Android Studio?
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.
- GridView con dos columnas, el primer elemento abarca ambas columnas
- Selección de un archivo de imagen de la Galería mediante FileProvider