web-dev-qa-db-fra.com

Comment utiliser la nouvelle fusion de manifest (d'Android Studio et de Gradle)?

Contexte

Dans le passé, quand Eclipse et ADT étaient les outils officiels pour développer pour Android, vous pouviez simplement utiliser "manifestmerger.enabled = true" dans "project.properties" du projet de l'application, et vous l'avez fusionner automatiquement tous les manifestes des bibliothèques (et j'ai posté à ce sujet ici ).

Cela a fonctionné, parfois. Il y avait beaucoup de problèmes étranges, et j'ai toujours préféré éviter de l'utiliser, et mettre manuellement ce qui est nécessaire dans le fichier manifeste principal. 

Le problème

Quelque part en 2014, Google a annoncé que le nouvel Android-Studio (0.1 je pense), en collaboration avec Gradle, vous permettra de choisir exactement le mode de fusion des composants des bibliothèques.

Cependant, les nouvelles instructions (link here ) sont très complexes et j'ai vraiment essayé de comprendre comment les utiliser, et n'ai pas trouvé non plus d'échantillons pour les utiliser.

Ce n'est pas que je n'ai rien compris, mais je ne suis pas sûr d'avoir bien compris.

Ce que j'ai trouvé

Le bon côté des choses, c’est que j’ai découvert que la fusion s’effectue de manière complètement automatique. Par conséquent, si vous avez un BroadcastReceiver sur le manifeste de la bibliothèque (et en tant que classe, bien sûr), il sera ajouté au projet de l’application qui l’utilise.

La question

Je ne peux pas simplement demander à tout pour être expliqué. Je pense qu'il suffira de poser ces questions:

  1. Comment choisir les composants de l'application (autorisations, activités, ...) à ignorer de la fusion automatique?

  2. Comment faire pour remplacer les attributs de composant de l'application (de la bibliothèque) (sur le projet de l'application)? par exemple le thème des activités?

  3. Existe-t-il un moyen de désactiver complètement la fusion automatique pour les fichiers de manifeste?

  4. Que se passe-t-il avec les manifestes de dépendances se trouvant dans des référentiels? Sont-ils fusionnés aussi? 

  5. Existe-t-il des tutoriels/échantillons/vidéos concernant cette nouvelle fonctionnalité (bien nouvelle pour moi)?

  6. Y a-t-il des choses que je devrais savoir lorsque j'utilise l'auto-fusion?

J'espère que ces questions sont suffisamment représentatives, suffisamment informatives, mais pas trop difficiles à répondre pour les personnes qui savent.

23
android developer

1. Éléments désactivants

Vous pouvez toujours explicitement désactiver les autorisations et les fonctionnalités du manifeste de votre application et remplacer les valeurs de la bibliothèque. Et j'ai trouvé que vous pouvez désactiver des éléments de la bibliothèque .

Exemple

Considérons le code suivant à partir du lien ci-dessus:

<activity-alias
    Android:name=”foo.bar.alias”>
  <meta-data 
      Android:name=”Zoo” 
      tools:node=”remove”/>
</activity-alias>

En ayant ce code dans votre manifeste, vous vous assurez que la fusion trouve tous les éléments <activity-alias> avec l'attribut Android:name="foo.bar.alias" et supprime un élément <meta-data> s'il contient l'attribut Android:name="Zoo". Il supprime uniquement les métadonnées "Zoo". Pas le pseudonyme d'activité. Si vous le spécifiez dans votre manifeste principal, cela s'appliquera à tout ce qui a déjà été fusionné (éléments de bibliothèques).

Exemple n ° 2

Depuis que vous avez demandé un exemple d’activités, voici ce que j’ai trouvé:

<activity Android:name="com.example.ui.MyActivity" tools:node="remove"/>

Cette ligne fera en sorte que la fusion supprime toutes les activités avec l'attribut Android:name="com.example.ui.MyActivity" qui ont été fusionnées jusqu'à présent. Donc, si vous le spécifiez dans votre manifeste principal, toutes les entrées com.example.ui.MyActivity qui auraient pu être fusionnées à partir de bibliothèques seront effectivement supprimées.

2. Attributs prioritaires de la bibliothèque

L'ordre dans lequel les valeurs sont fusionnées est décrit ici dans la section Classement des fichiers du manifeste. En gros, cela ressemble à ceci: bibliothèques, puis manifeste principal, puis saveurs et types de construction, si vous les utilisez. Comment remplacer les attributs de la bibliothèque?

Quels sont les types de construction?

Les valeurs par défaut sont "debug" et "release". Vous pouvez définir vos propres paramètres et les remplacer, par exemple signature ou proguard. Pour vos besoins, vous pouvez dire que c'est l'équivalent des configurations d'exécution.

Cela fonctionne comme ceci: vous mettez vos valeurs par défaut et partagées dans le manifeste main. Ensuite, dans les manifestes saveur, vous substituez les valeurs dont vous avez besoin. Google "Gradez les saveurs" pour plus d'informations.

3. Désactivation totale de la fusion manifeste

Désactiver la fusion de manifestes dans Android Gradle Build

Android.applicationVariants.all { variant ->
    variant.processResources.manifestFile = file('src/main/AndroidManifest.xml')
    variant.processManifest.enabled=false
}

Dans quel fichier mettez-vous cela?

À la fin de votre module _ (pas le projet racine) build.gradle.

4. Les manifestes des dépendances sont-ils fusionnés?

Oui, ils le sont (ce sont des bibliothèques).

Existe-t-il un moyen de bloquer la fusion des manifestes de librairie certains?

Pas que je sache, désolé.

5. Des tutoriels?

Cela dépend de ce que vous essayez d’atteindre. Jusqu'ici, cela a toujours fonctionné pour moi, tel quel.

Je ne connais aucune vidéo.

6. Quelque chose que je devrais être au courant?

Vous pouvez vérifier le manifeste généré si vous avez des doutes sur des autorisations supplémentaires, etc. Il se trouve dans project/module/build/intermediates/manifests/full/[flavor]/build-type/AndroidManifest.xml.

Sauce: http://tools.Android.com/tech-docs/new-build-system/user-guide/manifest-merger

39
Eugen Pechanec

Certains des liens de ce fil sont obsolètes. Voici le principal qui a été mis à jour concernant la fusion automatique de manifestes, par grade, pour les AAR Android.

https://developer.Android.com/studio/build/manifest-merge

0
nazmul idris