paquete - ¿Cómo utilizar la nueva fusión de manifiesto(de Android Studio y Gradle)?
package id android (2)
Fondo
En el pasado, cuando Eclipse y ADT eran las herramientas oficiales para desarrollar para Android, simplemente podía usar " manifestmerger.enabled = true " dentro de " project.properties " del proyecto de la aplicación, y conseguía fusionar todos los manifiestos de las bibliotecas automáticamente. (Y lo he publicado here ).
Esto funcionó, a veces. Tenía muchos problemas extraños, y siempre preferí simplemente evitar usarlo y poner manualmente lo que se necesita en el archivo principal de manifiesto.
El problema
En algún lugar del 2014, Google anunció que el nuevo Android-Studio (0.1 creo), junto con Gradle, le permitirá elegir exactamente cómo realizar la fusión de los componentes de las bibliotecas.
Sin embargo, las nuevas instrucciones (enlace here ) son muy complejas y realmente (realmente) traté de entender cómo usarlas, y tampoco encontré muestras de cómo usarlas.
No es que no entendiera nada, pero no estoy seguro de haberlo entendido bien.
Lo que he encontrado
En el lado positivo, descubrí que la fusión se realiza de forma completamente automática, por lo que si tiene un BroadcastReceiver en el manifiesto de la biblioteca (y como clase, por supuesto), se agregará al proyecto de la aplicación que lo utiliza.
La pregunta
No puedo simplemente pedir que todo sea explicado. Creo que será suficiente hacer esas preguntas:
¿Cómo puedo elegir qué componentes de la aplicación (permisos, actividades, ...) se ignorarán para que no se fusionen automáticamente?
¿Cómo puedo señalar los atributos de los componentes de la aplicación (de la biblioteca) (en el proyecto de la aplicación)? ¿Por ejemplo el tema de las actividades?
¿Hay alguna manera de deshabilitar completamente la fusión automática para los archivos de manifiesto?
¿Qué pasa con los manifiestos de dependencias que están dentro de los repositorios? ¿Se fusionan también?
¿Hay tutoriales / muestras / videos con respecto a esta nueva característica (bueno para mí)?
¿Hay alguna cosa que deba tener en cuenta al utilizar la fusión automática?
Espero que esas preguntas sean lo suficientemente representativas, informativas, pero no demasiado difíciles de responder para las personas que lo saben.
1. Elementos incapacitantes.
Siempre puede deshabilitar explícitamente los permisos y las funciones en el manifiesto de su aplicación y anular cualquier valor de biblioteca. Y encontré que puedes deshabilitar elementos de la biblioteca .
Ejemplo
Considere el siguiente código del enlace anterior:
<activity-alias
android:name=”foo.bar.alias”>
<meta-data
android:name=”zoo”
tools:node=”remove”/>
</activity-alias>
Al tener este código dentro de su manifiesto, se asegura de que la fusión encuentre cualquier elemento <activity-alias>
con el atributo android:name="foo.bar.alias"
y elimina un elemento <meta-data>
si tiene el android:name="zoo"
Atributo del android:name="zoo"
. Sólo elimina los metadatos del "zoo". No es el alias de actividad. Si especifica esto en su manifiesto principal, será efectivo en todo lo que se haya fusionado hasta ahora (elementos de las bibliotecas).
Ejemplo # 2
Ya que solicitó un ejemplo con actividades, esto es lo que he encontrado:
<activity android:name="com.example.ui.MyActivity" tools:node="remove"/>
Esta línea hará que la fusión elimine cualquier actividad con el atributo android:name="com.example.ui.MyActivity"
que se ha fusionado hasta el momento. Por lo tanto, si especifica esto en su manifiesto principal, eliminará de manera efectiva cualquier entrada com.example.ui.MyActivity
que pueda haberse fusionado desde las bibliotecas.
2. Anulando atributos de la biblioteca
El orden en que se fusionan los valores se describe here en la sección Ordenación de archivos de manifiesto. Básicamente, funciona de la siguiente manera: bibliotecas, luego el manifiesto principal, luego los sabores y los tipos de compilación se manifiestan si los usa. ¿Cómo anular los atributos de la biblioteca?
¿Qué son los tipos de construcción?
Los predeterminados son "depurar" y "liberar". Puede definir su propia configuración y anularla, como la firma o la programación . Para tus propósitos, podrías decir que es el equivalente a ejecutar configuraciones.
Funciona así: coloca sus valores predeterminados y compartidos dentro del manifiesto main
. Luego, en los manifiestos de sabor , anula los valores que necesitas. Google "Gradle Fours" para más información.
3. Deshabilitar la fusión manifiesta por completo
Deshabilitar la fusión manifiesta en Android Gradle Build
android.applicationVariants.all { variant ->
variant.processResources.manifestFile = file(''src/main/AndroidManifest.xml'')
variant.processManifest.enabled=false
}
¿En qué archivo pones esto?
Al final de su módulo (no del proyecto raíz) build.gradle
.
4. ¿Se fusionan los manifiestos de las dependencias?
Sí lo son (son bibliotecas).
¿Hay una manera de bloquear la fusión de ciertos manifiestos de la biblioteca?
No que yo sepa, lo siento.
5. ¿Algún tutorial?
Depende de lo que estés tratando de lograr. Hasta ahora siempre ha funcionado para mí fuera de la caja.
- por ejemplo, http://www.myandroidsolutions.com/2014/04/10/android-gradle-manifest-merge/
- La documentación de la fusión de manifiesto (enlace a continuación).
No sé sobre ningún video.
6. ¿Algo de lo que deba estar enterado?
Puede verificar el manifiesto generado si sospecha sobre permisos adicionales, etc. Se encuentra en project/module/build/intermediates/manifests/full/[flavor]/build-type/AndroidManifest.xml
.
Salsa: here
Algunos de los enlaces en este hilo están obsoletos. Aquí está el principal que se actualiza relacionado con la fusión automática de manifiestos, por Gradle, para AARs de Android.