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?
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."
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é:
Le conflit peut être résolu de deux manières:
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.
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"
.
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 .
J'ai corrigé le même problème. Solution pour moi:
xmlns:tools="http://schemas.Android.com/tools"
dans la balise manifestetools:replace=..
dans la balise manifesteAndroid:label=...
dans la balise manifesteJe faisais également face aux mêmes problèmes et, après de nombreuses recherches, j'ai trouvé l'âme
- 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.
- 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
- 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
- Si vous avez supprimé une activité de votre projet, supprimez-la également de votre fichier manifeste.
- 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
Je viens de retirer
Android:label="@string/app_name
du manifest file
et cela a fonctionné!