web-dev-qa-db-fra.com

Android Manifeste de bibliothèque vs Manifeste d'application

J'ai lu des questions similaires ici, mais je ne suis toujours pas clair sur quelques points. L'utilisation d'un projet de bibliothèque signifie que mon projet global aura deux manifestes - un pour la bibliothèque et l'autre pour le projet d'application "principal" - et je ne sais pas ce qui se passe ou s'il y a une redondance.

Je suis en train de développer un widget d'application avec des versions "lite" et "payante", donc il y aura presque tout le code dans un projet de bibliothèque. En tant que widget, la bibliothèque aura au moins un récepteur, un service, une activité de configuration, ainsi que quelques autres activités. Alors, où les déclarations complètes de ces composants - y compris les intentions, les filtres, etc. - doivent-elles être déclarées? Va-t-il dans le manifeste de la bibliothèque ou dans le manifeste du package d'application lui-même, référençant les classes de la bibliothèque (par exemple Android: name = "com.foo.mylibrary.MyService")?

Certains exemples que j'ai examinés semblent les déclarer dans les deux manifestes, mais je soupçonne que les mettre dans l'un ou l'autre est un non-op.

39
gordonwd

L'utilisation d'un projet de bibliothèque signifie que mon projet global aura deux manifestes - un pour la bibliothèque et l'autre pour le projet d'application "principal" - et je ne sais pas ce qui se passe ou s'il y a une redondance.

Le manifeste du projet de bibliothèque n'est pas actuellement utilisé.

Gradle pour Android, et donc Android Studio, prend en charge les projets de bibliothèque et les AAR publiant un manifeste. Cela peut inclure des choses comme les déclarations d'activité, les autorisations ou fonctionnalités requises, ou le minimum pris en charge Android Niveaux SDK.

Les règles de fusion des manifestes de bibliothèque avec le propre manifeste de l'application, en particulier lorsque vous tenez compte des types de build et des versions de produit, sont n peu complexes .

Alors, où les déclarations complètes de ces composants - y compris les intentions, les filtres, etc. - doivent-elles être déclarées?

Dans le projet Host.

La bibliothèque peut publier ces composants et le projet Android Studio Host peut ensuite les supprimer si nécessaire.

Va-t-il dans le manifeste de la bibliothèque ou dans le manifeste du package d'application lui-même, référençant les classes de la bibliothèque (par exemple Android: name = "com.foo.mylibrary.MyService")?

Le dernier.

Dans les deux cas (avec Gradle pour Android et Android Studio). En théorie, il est plus facile pour la bibliothèque de publier les composants, donc l'auteur de l'application ne Personnellement, je ne suis pas un grand fan de cela, car trop de développeurs finiront par envoyer des entrées de manifeste inutiles.

43
CommonsWare

Depuis l'ADT r20 Preview 3, il est désormais possible de fusionner les manifestes. Une configuration commune peut donc désormais être insérée dans le manifeste de la bibliothèque. Voir https://stackoverflow.com/a/10400355/262789 pour plus d'informations.

La version 13 d'Intellij IDEA est nécessaire pour le support de fusion manifeste (manifestmerger.enabled=true). Aussi le système de construction basé sur les notes semble être nécessaire pour Android Support Studio.

9
Benjamin

Tous les éléments référencés Android comme les activités, les récepteurs, les services, etc. DOIVENT entrer dans votre manifeste d'application ou ils ne seront pas reconnus par le système d'exploitation. Comme vous l'avez deviné, le fichier manifeste de la bibliothèque est à peu près une implémentation vide

MISE À JOUR

Comme CommonsWare le souligne ci-dessus, les outils de construction Android tenteront désormais de fusionner les différents manifestes en votre nom. Laissant la réponse originale à la postérité

5
JRaymond