Manifiesto de la biblioteca de Android contra el manifiesto de la aplicación

He leído preguntas similares aquí, pero todavía no estoy claro en un par de cosas. El uso de un proyecto de biblioteca significa que mi proyecto global 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 "pagadas", por lo que tendré casi todo el código en un proyecto de biblioteca. Siendo un widget, la biblioteca tendrá al menos un receptor, un servicio, una actividad de configuración, además de un par de otras actividades. Entonces, ¿dónde deben declararse las declaraciones completas de estos componentes -incluyendo intentos, filtros, etc.? ¿Van en el manifiesto de la biblioteca, o en el manifiesto para el paquete de 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 o en el otro es un no-op.

El uso de un proyecto de biblioteca significa que mi proyecto global 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, proyectos de biblioteca de soporte y AAR publicando un manifiesto. Esto puede incluir cosas como declaraciones de actividad, permisos o características requeridas, o niveles mínimos de SDK para Android compatibles.

Las reglas de cómo se manifiestan las bibliotecas se combinan con el propio manifiesto de la aplicación, especialmente cuando se toman en cuenta los tipos de construcción y los sabores del producto, es un poco complejo .

Entonces, ¿dónde deben declararse las declaraciones completas de estos componentes -incluyendo intentos, filtros, etc.?

En el proyecto anfitrión.

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

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

El último.

En cualquiera (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 muchos desarrolladores terminarán enviando entradas de manifiesto innecesarias.

A partir de ADT r20 Preview 3 ya es posible fusionar los manifiestos. La configuración tan común ahora se puede poner en el manifiesto de la biblioteca. Consulte https://stackoverflow.com/a/10400355/262789 para obtener más información.

La versión 13 de Intellij IDEA es necesaria para el soporte de fusión manifestmerger.enabled=true ( manifestmerger.enabled=true ). Además, el sistema de compilación basado en grados parece ser necesario para la compatibilidad con Android Studio.

Cualquier elemento androide de referencia como actividades, receptores, servicios, etc. DEBE entrar en su manifiesto de aplicación o no serán reconocidos por el sistema operativo. Como usted adivinó, el archivo de manifiesto de la biblioteca es prácticamente una implementación vacía

ACTUALIZAR

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

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.