web-dev-qa-db-fra.com

Outils: remplacer pas remplacer dans le manifeste Android

J'utilise un projet Gradle avec de nombreuses dépendances de bibliothèque et j'utilise la nouvelle fusion de manifeste. Dans ma balise <application />, 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
122
agrosner

Déclarez l'en-tête de votre manifeste comme ceci

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

Ensuite, vous pouvez ajouter à votre balise d'application l'attribut suivant:

<application
    tools:replace="icon, label" ../>

Par exemple, je dois remplacer l'icône et l'étiquette. Bonne chance!

188
Andrus

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:

 <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
        xmlns:tools="http://schemas.Android.com/tools"
              tools:replace="allowBackup, label"
              Android:allowBackup="false"
              Android:label="@string/all_app_name"/>
35
stefan K

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é. 

34
GLee

Je viens de vivre le même comportement de tools:replace=... que celui décrit par l'OP. 

Il s’est avéré que la cause fondamentale de l’ignorance de tools:replace par la fusion de manifestes est un bogue décrit ici . Cela signifie que si votre bibliothèque contient un manifeste avec un noeud <application ...> contenant un attribut tools:ignore=..., il peut arriver que l'attribut tools:replace=... du manifeste de votre module principal soit ignoré.

Le point délicat ici est que cela peut se produire, mais n’est pas obligé. Dans mon cas, j'avais deux bibliothèques, la bibliothèque A avec l'attribut tools:ignore=..., la bibliothèque B avec les attributs à remplacer dans les manifestes respectifs et l'attribut tools:replace=... 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, modifier l'ordre dans la section des 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 le problème de la bibliothèque, de supprimer la balise tools:ignore=... (ce qui ne devrait pas poser de problème, car il ne s'agit que d'un conseil pour lint) et de ranger la bibliothèque à nouveau.

Et votez pour que le bogue soit corrigé, de cause.

30
Nantoka

Solution de travail finale pour moi (a mis en évidence les exemples dans le code exemple):

  1. ajouter la ligne xmlns:tools dans la balise manifeste
  2. ajouter tools:replace dans la balise d'application

Exemple:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="pagination.yoga.com.tamiltv"
    **xmlns:tools="http://schemas.Android.com/tools"**
    >

    <uses-permission Android:name="Android.permission.INTERNET" />
    <uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission Android:name="Android.permission.ACCESS_WIFI_STATE" />

    <application
        Android:allowBackup="true"
        Android:icon="@drawable/ic_launcher"
        Android:label="@string/app_name"
        Android:theme="@style/AppTheme"
        **tools:replace="Android:icon,Android:theme"**
        >
16
Yogamurthy

La pièce manquante pour moi était la suivante:

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

par exemple:

<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
  xmlns:tools="http://schemas.Android.com/tools"
    package="com.your.appid">
12
partizan

Vous pouvez remplacer ceux de votre balise d'application Manifest:

<application
    tools:replace="Android:icon, Android:label, Android:theme, Android:name,Android:allowBackup"
Android:allowBackup="false"...>

et travaillera pour vous.

Vous pouvez remplacer ceux de votre balise Manifest application:

<application
    ...
    tools:replace="Android:label, Android:icon, Android:theme"/>

et travaillera pour vous.

Explication

L'utilisation d'une telle dépendance/bibliothèque dans votre fichier gradle qui a ces étiquettes dans la balise d'application de son manifeste peut générer ce problème et les remplacer dans votre Manifest constitue la solution.

4
blueware

FIXED IT A EU L'ERREUR EXACTE, Ajoutez juste ces outils: replace = "Android: icône, Android: thème"

dans votre application tag dans votre manifeste, cela fonctionne très bien, 

4
Ismael ozil

Le hack suivant fonctionne:

  1. ajouter la ligne xmlns:tools="http://schemas.Android.com/tools" dans la balise manifeste
  2. ajouter tools:replace="Android:icon,Android:theme,Android:allowBackup,label" dans la balise d'application
0
Shoaib Ahmed

Je recevais une erreur similaire sur un projet que j'importais:

Plusieurs entrées avec la même clé: Android: icon = REPLACE et outils: icon = REMPLACER

Correction après modification de la ligne ci-dessous dans la balise d'application:

tools:replace="icon, label, theme"

à

tools:replace="Android:icon, Android:label, Android:theme"
0
brybry

J'ai également traversé ce problème et changé cela:

<application  Android:debuggable="true" Android:icon="@drawable/app_icon" Android:label="@string/app_name" Android:supportsRtl="true" Android:allowBackup="false" Android:fullBackupOnly="false" Android:theme="@style/UnityThemeSelector">

à

 <application tools:replace="Android:allowBackup" Android:debuggable="true" Android:icon="@drawable/app_icon" Android:label="@string/app_name" Android:supportsRtl="true" Android:allowBackup="false" Android:fullBackupOnly="false" Android:theme="@style/UnityThemeSelector">
0
Saeed Aliakbari