J'utilise un projet gradle avec de nombreuses dépendances de bibliothèques différentes et j'utilise la nouvelle fusion manifeste. Dans mon <application />
tag, je l'ai configuré comme tel:
<application tools:replace="android:icon, android:label, android:theme, android:name"
android:name="com.example.myapp.MyApplcation"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/application_name"
android:logo="@drawable/logo_ab"
android:theme="@style/AppTheme"
>
....
</application>
Pourtant, je reçois l'erreur:
/android/MyApp/app/src/main/AndroidManifest.xml:29:9 Error:
Attribute application@icon value=(@drawable/ic_launcher) from AndroidManifest.xml:29:9
is also present at {Library Name} value=(@drawable/app_icon)
Suggestion: add 'tools:replace="android:icon"' to <application> element at AndroidManifest.xml:26:5 to override
/android/MyApp/app/src/main/AndroidManifest.xml:30:9 Error:
Attribute application@label value=(@string/application_name) from AndroidManifest.xml:30:9
is also present at {Library Name} value=(@string/app_name)
Suggestion: add 'tools:replace="android:label"' to <application> element at AndroidManifest.xml:26:5 to override
/android/MyApp/app/src/main/AndroidManifest.xml:27:9 Error:
Attribute application@name value=(com.example.myapp.MyApplication) from AndroidManifest.xml:27:9
is also present at {Another Library}
Suggestion: add 'tools:replace="android:name"' to <application> element at AndroidManifest.xml:26:5 to override
/android/MyApp/app/src/main/AndroidManifest.xml:32:9 Error:
Attribute application@theme value=(@style/AppTheme) from AndroidManifest.xml:32:9
is also present at {Library Name} value=(@style/AppTheme)
Suggestion: add 'tools:replace="android:theme"' to <application> element at AndroidManifest.xml:26:5 to override
android
android-gradle-plugin
agrosner
la source
la source
<application>
balise répétée dans le projet. Veuillez vous assurer qu'il n'y en a qu'un<application>
.Réponses:
Déclarez votre en-tête manifeste comme ceci
Ensuite, vous pouvez ajouter à votre balise d'application l'attribut suivant:
Par exemple, je dois remplacer l'icône et l'étiquette. Bonne chance!
la source
tools:node="replace"
:<meta-data tools:node="replace" android:name="QUERY_LOG" android:value="true" />
etc.tools:replace
à ma balise d'application qui devrait la remplacer et non la source qui devrait être remplacée. Les manifestes de mon application remplacent donc ce qui est défini dans ma bibliothèque. Vous dites "ce qui doit être remplacé" au lieu de "ce qui peut être remplacé". J'espère que cela clarifie les questions.tools:replace="android:versionCode, android:versionName"
doit être à l'intérieur de la<manifest >
balise.J'ai résolu le même problème. Solution pour moi:
xmlns:tools="http://schemas.android.com/tools"
ligne dans la balise manifestetools:replace=..
la balise manifesteandroid:label=...
dans la balise manifesteExemple:
la source
<manifest>
directement au lieu de sous<application>
était la seule chose qui a résolu mon problème.Essayez de réorganiser vos dépendances dans votre fichier gradle. J'ai dû déplacer la bibliothèque incriminée du bas de la liste vers le haut, puis cela a fonctionné.
la source
Je viens de vivre le même comportement
tools:replace=...
que celui décrit par l'OP.Il s'est avéré que la cause première de l'
tools:replace
ignorance de la fusion du manifeste est un bogue décrit ici . Cela signifie essentiellement que si vous avez une bibliothèque dans votre projet qui contient un manifeste avec un<application ...>
nœud contenant untools:ignore=...
attribut, il peut arriver que l'tools:replace=...
attribut dans le manifeste de votre module principal soit ignoré.Le point délicat ici est que cela peut arriver, mais ce n'est pas obligatoire. Dans mon cas, j'avais deux bibliothèques, la bibliothèque A avec l'
tools:ignore=...
attribut, la bibliothèque B avec les attributs à remplacer dans les manifestes respectifs et l'tools:replace=...
attribut dans le manifeste du module principal. Si le manifeste de B était fusionné dans le manifeste principal avant le manifeste de A, tout fonctionnait comme prévu. Dans l'ordre de fusion opposé, l'erreur est apparue.L'ordre dans lequel ces fusions se produisent semble être quelque peu aléatoire. Dans mon cas, changer l'ordre dans la section dépendances de
build.gradle
n'a eu aucun effet, mais changer le nom de la saveur l'a fait.Ainsi, la seule solution de contournement fiable semble être de décompresser la bibliothèque à l'origine du problème, de supprimer la
tools:ignore=...
balise (ce qui ne devrait pas poser de problème car il s'agit d'un indice pour les peluches uniquement) et de réemballer la bibliothèque.Et votez pour que le bug soit corrigé, pour cause.
la source
<manifest>
nœud du<application>
nœud et cela a fonctionné.Solution de travail finale pour moi (mis en évidence les tages dans l'exemple de code):
xmlns:tools
ligne dans la balise manifestetools:replace
la balise d'applicationExemple:
la source
La pièce manquante pour moi était la suivante:
par exemple:
la source
Vous pouvez les remplacer dans votre balise d'application Manifest:
et travaillera pour vous.
la source
tools:replace="android:label"
à l'application mais cela ne fonctionne pasFIXE IL AVAIT L'ERREUR EXACTE, il suffit d'ajouter ces outils: replace = "android: icon, android: theme"
dans votre balise d' application dans votre manifeste, cela fonctionne très bien,
la source
Vous pouvez les remplacer dans votre
application
balise Manifest :et travaillera pour vous.
Explication
L'utilisation d'une telle dépendance / bibliothèque dans votre
gradle
fichier qui a ces étiquettes dans la balise d'application de son manifeste peut produire ce problème et les remplacer dans votreManifest
est la solution.la source
Le hack suivant fonctionne:
xmlns:tools="http://schemas.android.com/tools"
ligne dans la balise manifestetools:replace="android:icon,android:theme,android:allowBackup,label"
la balise d'applicationla source
Mon problème est un projet multi-modules avec un module de base, un module d'application et un module de fonctionnalités. Chaque module a son propre AndroidManifest, et j'ai implémenté une variante de construction pour le débogage et le main. Nous devons donc nous assurer que "android: name" vient d'être déclaré dans Manifest de debug et main uniquement, et ne le définissez dans aucun Manifest dans le module enfant. Ex: Manifeste en main:
Manifeste dans le débogage:
Ne définissez pas "android: nom" dans d'autres fichiers Manifest comme ceci:
Il suffit de définir dans le module de fonctionnalités comme celui-ci et il fusionnera bien
la source
Je recevais une erreur similaire sur un projet que j'importais:
Correction après avoir changé la ligne ci-dessous dans la balise d'application:
à
la source
J'ai également traversé ce problème et changé cela:
à
la source
la source