Android Biblioteca de Manifiesto vs Manifiesto de la Aplicación


He leído preguntas similares aquí, pero todavía no tengo claro un par de cosas. Usar un proyecto de Biblioteca significa que mi proyecto general tendrá dos manifiestos, uno para la biblioteca y el otro para el proyecto de la aplicación "principal", y no estoy claro qué va en qué o si hay alguna redundancia.

Estoy desarrollando un widget de aplicación con versiones "lite" y "paid", por lo que tendrá casi todo el código en un proyecto de biblioteca. Al ser un widget, la biblioteca tendrá, al menos, un receptor, un servicio, un actividad de configuración, además de un par de otras actividades. Entonces, ¿dónde deberían estar las declaraciones completas de estos componentes including incluyendo intents, filtros, etc. -- ser declarado? Van en el manifiesto para la biblioteca, o en el manifiesto para el paquete de la aplicación en sí, haciendo referencia a las clases en la biblioteca (por ejemplo, android:name="com.foo.mylibrary.MyService")?

Algunos ejemplos que he visto parecen declararlos en ambos manifiestos, pero sospecho que ponerlos en uno u otro es un no-op.

Author: erdemlal, 2012-04-16

3 answers

Usar un Proyecto de Biblioteca significa que mi proyecto general tendrá dos manifiestos-uno para la biblioteca y el otro para el proyecto de la aplicación "principal" - y no estoy claro qué va en qué o si hay alguna redundancia.

El manifiesto del proyecto de biblioteca no se utiliza actualmente.

Gradle para Android, y por lo tanto Android Studio, admite proyectos de bibliotecas y AARs que publican un manifiesto. Esto puede incluir cosas como declaraciones de actividad, permisos requeridos o características, o niveles mínimos de SDK de Android compatibles.

Las reglas para cómo se fusionan los manifiestos de la biblioteca con el manifiesto propio de la aplicación, particularmente cuando se tienen en cuenta los tipos de compilación y los tipos de productos, son un poco complejas.

Entonces, ¿dónde deberían estar las declaraciones completas de estos componentes including incluyendo intents, filtros, etc. -- ser declarado?

En el proyecto anfitrión.

La biblioteca podría publicar esos componentes, y el Android Studio host project puede eliminarlos si es necesario.

Van en el manifiesto para la biblioteca, o en el manifiesto para el paquete de la aplicación en sí, haciendo referencia a las clases en la biblioteca (por ejemplo, android:name="com.foo.mylibrary.MyService")?

Este último.

En cualquiera de los dos (con Gradle para Android y Android Studio). En teoría, es más fácil para la biblioteca publicar los componentes, por lo que el autor de la aplicación no tiene que hacerlo. Personalmente, no soy un gran fan de esto, ya que demasiados desarrolladores terminarán enviando entradas de manifiesto innecesarias.

 43
Author: CommonsWare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-29 15:33:36

A partir de ADT r20 Preview 3 ahora es posible fusionar manifiestos. Así que la configuración común ahora se puede poner en el manifiesto de la biblioteca. Véase https://stackoverflow.com/a/10400355/262789 para más información.

La versión 13 de Intellij IDEA es necesaria para el soporte de fusión de manifiestos (manifestmerger.enabled=true). También el sistema de compilación basado en calificaciones parece ser necesario para la compatibilidad con Android Studio.

 9
Author: Benjamin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:25:54

Cualquier elemento de Android referenciado como actividades, receptores, servicios, etc. DEBE entrar en el manifiesto de la aplicación o no serán reconocidos por el sistema operativo. Como ha adivinado, el archivo de manifiesto de la biblioteca es más o menos una implementación vacía

UPDATE

Como CommonsWare señala anteriormente, las herramientas de compilación de Android ahora intentarán fusionar los diversos manifiestos en su nombre. Dejando la respuesta original para la posteridad

 5
Author: JRaymond,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-28 00:23:23