37

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 general tendrá dos manifiestos, uno para la biblioteca y otro para el proyecto de la aplicación "principal", y no tengo claro qué ocurre o si hay alguna redundancia.Android Library Manifest vs. App Manifest

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, una actividad de configuración, más un par de otras actividades. Entonces, ¿dónde deberían declararse las declaraciones completas de estos componentes, incluidos los intentos, los filtros, etc.? ¿Van en el manifiesto de la biblioteca o en el manifiesto del paquete de la aplicación, 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 no es operativo.

Respuesta

43

El uso de un proyecto de biblioteca significa que mi proyecto general tendrá dos manifiestos, uno para la biblioteca y otro para el proyecto de la aplicación "principal", y no tengo claro qué ocurre si es alguna redundancia.

El manifiesto del proyecto de la biblioteca no se utiliza actualmente.

Gradle para Android, y por lo tanto Android Studio, admite proyectos de biblioteca y AAR publica un manifiesto. Esto puede incluir elementos como declaraciones de actividad, permisos o características requeridas o niveles mínimos compatibles de Android SDK.

Las reglas sobre cómo se fusionan los manifiestos de la biblioteca con el propio manifiesto de la aplicación, especialmente cuando se tienen en cuenta los tipos de compilación y los sabores de los productos, es a bit complex.

Entonces, ¿dónde deberían declararse las declaraciones completas de estos componentes, incluidos los intentos, filtros, etc.?

En el proyecto de host.

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

qué van en el manifiesto de la biblioteca, o en el manifiesto para el propio paquete de la aplicación, 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 admirador de esto, ya que muchos desarrolladores terminarán enviando entradas de manifiesto innecesarias.

+0

Gracias. Esto tiene más sentido (¡no es que tenga sentido siempre se aplica!). – gordonwd

+2

@CommonsWare - Siempre me encantan tus respuestas directas. ¡Y en este caso me ayudó! – Matt

+4

@CommonsWare a partir de ADT r20 preview 3 ahora es posible fusionar manifiestos. Entonces, la configuración común ahora se puede poner en el manifiesto de la biblioteca. http://stackoverflow.com/a/10400355/262789 – Benjamin

5

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

ACTUALIZACIÓN

Como CommonsWare señala anteriormente, el Android construir herramientas ahora se intentará fusionar los diversos manifiestos en su nombre. Dejando la respuesta original para la posteridad

+0

Gracias. Para leer algunos artículos, parecía que los manifiestos se fusionarían o algo así. Es bueno aclararlo. – gordonwd

+0

Dado que esta respuesta tiene cuatro años, quizás sea bueno señalar que ahora es incorrecta. Ver la respuesta actualizada de Commonsware arriba. – JHH

+0

@JHH hecho, gracias – JRaymond

9

A partir de ADT r20 Vista previa 3 ahora es posible fusionar manifiestos. Entonces, la configuración 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 manifestar el soporte de fusión (manifestmerger.enabled=true). También el sistema de compilación basado en Grados appears to be necessary para el soporte de Android Studio.