web-dev-qa-db-fra.com

Erreur de fusion manifeste a échoué

Je suis en train de transférer une énorme application de mes projets actuels dans Android Studio et Gradle. Je suis actuellement bloqué sur le problème suivant:

Error:(87, 9) Execution failed for task ':App:processDebugManifest'.
> Manifest merger failed : Attribute application@label value=(@string/app_label) from AndroidManifest.xml:87:9
    is also present at Android_APPLICATION:Library:unspecified:9:18 value=(@string/app_name)
    Suggestion: add 'tools:replace="Android:label"' to <application> element at AndroidManifest.xml:82:5 to override

J'ai essayé d'ajouter les attributs suivants au fichier AndroidManifest.xml principal:

tools:replace="Android:label, *App Name*"
tools:replace="Android:label, @string/app_label"
tools:replace="Android:label"

Aucune de ces définitions d'attribut ne fonctionne. Qu'est-ce que je fais mal?

48
James King

Essayez ceci:

Ajoutez ceci à <manifest/>

xmlns:tools="http://schemas.Android.com/tools"

Ajoutez ceci à <application/>

tools:node="replace"

Basé sur this , il devrait remplacer tous les éléments. "Remplace la déclaration de priorité inférieure par celle annotée."

125
Kayvan N

Contexte

Lorsque les fichiers de manifeste sont en cours de fusion, il existe un conflit avec l'attribut label

En général, il existe trois types de fichiers manifestes qui doivent être fusionnés dans un seul manifeste d'application résultant, ici par ordre de priorité:

  1. Des variantes de produit et des types de manifeste spécifiques à des types de construction. 
  2. Fichier manifeste principal pour l'application. 
  3. Fichiers du manifeste de la bibliothèque.

Les résolutions

Le conflit peut être résolu de deux manières:

Supprimer l'étiquette en conflit

Supprimez l'attribut en conflit du fichier manifeste de la bibliothèque (ou du niveau inférieur). 

Dans ce cas, la fonction Android_APPLICATION:Library:unspecified:9:18 value=(@string/app_name) a une valeur @string/app_name définie différente de celle de l'application principale. Donc, si ce n'est pas nécessaire, supprimez-le - supprimez simplement le Android:label="@string/app_name" du fichier AndroidManifest.xml du fichier de bibliothèque.

Ajouter un attribut pour permettre une résolution automatique du conflit

Il existe plusieurs marqueurs d'attributs spéciaux (dans l'espace de noms des outils) qui peuvent être utilisés pour exprimer une décision spécifique sur la façon de résoudre les conflits.

Dans ce cas, pour que le Android:label de l'application principale remplace explicitement toute autre étiquette d'application (fichier de bibliothèque, par exemple), ajoutez la définition xmlns:tools="http://schemas.Android.com/tools" au nœud <manifest> et tools:replace="label" au nœud <application>

Voici un exemple - utilisez ceci dans le fichier AndroidManifest.xml de l'application principale:

<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.mycompany.myapp"
    xmlns:tools="http://schemas.Android.com/tools">

    <application
        Android:label="@string/app_name"
        tools:replace="label"/>
</manifest>

Cette approche fonctionnerait également avec tout autre attribut en conflit. Par exemple, si l'attribut icon était également en conflit, il pourrait être remplacé par tools:replace="label, icon".

32
CJBS

Si vous aviez de la chance, comme moi, vous pouvez résoudre le problème manuellement avec une solution de rechange. 

Les fichiers AAR sont juste des fichiers .Zip avec une extension .aar. Dans mon cas, j'ai dézippé le fichier .aar, supprimé le Android:label incriminé du AndroidManifest.xml de la bibliothèque, puis rétrogradé les fichiers restants avec une extension .aar et tout semble parfaitement fonctionner avec le nouveau .aar.

FYI, cela semble être un bogue connu dans le plugin Android Gradle .

4
dm78

J'ai corrigé le même problème. Solution pour moi:

  1. ajouter la ligne xmlns:tools="http://schemas.Android.com/tools" dans la balise manifeste
  2. ajouter tools:replace=.. dans la balise manifeste
  3. déplacer Android:label=... dans la balise manifeste

Exemple ici

3
stefan K

Je faisais également face aux mêmes problèmes et, après de nombreuses recherches, j'ai trouvé l'âme

  1. votre version de sdk min doit être identique à celle des modules que vous utilisez Par exemple: votre version du module sdk min est 14 et celle de votre application sdk min est 9 Ça devrait être pareil.
  2. Si la version de construction de votre application et les modules ne sont pas identiques. Encore une fois il devrait même

En bref, votre fichier build.gradle et votre manifeste doivent avoir les mêmes configurations

  1. Il n'y a pas de double comme les mêmes autorisations ajoutées deux fois dans le fichier manifeste, la même activité mentionnée deux fois
  2. Si vous avez supprimé une activité de votre projet, supprimez-la également de votre fichier manifeste.
  3. Parfois, c’est son étiquette, son icône, etc balise du fichier manifeste a) ajoutez la ligne xmlns: tools dans la balise manifest b) ajouter des outils: replace = ou tools: ignore = dans la balise d'application Exemple
   <manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.slinfy.ikharelimiteduk"
xmlns:tools="http://schemas.Android.com/tools"
Android:versionCode="1"
Android:versionName="1.0" >
<application
    tools:replace="icon, label"
    Android:label="myApp"
    Android:name="com.example.MyApplication"
    Android:allowBackup="true"
    Android:hardwareAccelerated="false"
    Android:icon="@drawable/ic_launcher"
    Android:theme="@style/Theme.AppCompat" >
</application>
</manifest>

En tenant compte de ces points, vous vous débarrasserez de ce problème de fusion manifeste Consultez mon message: Ce problème est dû au fichier Manifest ou au fichier build.gradle. Vous pouvez consulter mon message https://wordpress.com/post/dhingrakimmi.wordpress.com/23

0
Kimmi Dhingra

Je viens de retirer 

Android:label="@string/app_name

du manifest file et cela a fonctionné!

0
itzo