Инструменты: заменить не замену в манифесте Android

Я использую проект градиента со многими различными библиотечными зависимостями и используя новое слияние манифеста. В моем <application /> я настроил его как таковой:

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

Но я получаю ошибку:

 /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 

Solutions Collecting From Web of "Инструменты: заменить не замену в манифесте Android"

Объявите свой заголовок манифеста следующим образом

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

Затем добавьте в свой тег приложения следующий атрибут:

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

Например, мне нужно заменить значок и метку. Удачи!

Попробуйте переупорядочить ваши зависимости в файле gradle. Мне пришлось переместить библиотеку-нарушитель из нижней части списка в верхнюю часть, а затем она сработала.

Я просто испытал такое же поведение tools:replace=... как описано OP.

Оказалось, что основная причина для tools:replace игнорирование манифеста слиянием – это ошибка, описанная здесь . Это в основном означает, что если в вашем проекте есть библиотека, содержащая манифест с узлом <application ...> содержащий атрибут tools:ignore=... , может случиться, что атрибут tools:replace=... в Манифест вашего основного модуля будет проигнорирован.

Трудный момент в том, что это может произойти, но не обязательно. В моем случае у меня было две библиотеки, библиотека A с tools:ignore=... атрибут, библиотека B с атрибутами, которые должны быть заменены в соответствующих манифестах и tools:replace=... атрибут в манифесте основного модуля , Если манифест B был объединен в основной манифест перед манифестом A, все работало, как ожидалось. В противоположном порядке слияния возникла ошибка.

Порядок, в котором происходят эти слияния, кажется несколько случайным. В моем случае изменение порядка в разделе зависимостей build.gradle не повлияло, но изменило название аромата.

Таким образом, единственное надежное обходное решение, похоже, состоит в том, чтобы распаковать проблему, вызывающую библиотеку, удалить tools:ignore=... tag (что не должно быть проблемой, поскольку это подсказка только для lint) и снова упаковать библиотеку.

И проголосуйте за ошибку, которая будет исправлена, из-за причины.

Я исправил ту же проблему. Решение для меня:

  1. Добавьте строку xmlns:tools="http://schemas.android.com/tools" в теге манифеста
  2. Добавить tools:replace=.. в теге манифеста
  3. Move android:label=... в теге манифеста

Пример:

  <?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"/> 

Заключительное рабочее решение для меня (выделено значение в примере кода):

  1. Добавьте строку xmlns:tools в тег манифеста
  2. Добавить tools:replace в теге приложения

Пример:

 <?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"** > 

У ФИКСИРОВАННОГО ЭТОГО УБЕДИТЕСЬ ОШИБКУ, просто добавьте эти инструменты: replace = "android: icon, android: theme"

В ваш тег приложения в манифесте, он работает отлично,

Вы можете заменить те, которые указаны в теге application Manifest:

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

И будет работать на вас.

объяснение

Использование такой зависимости / библиотеки в вашем файле gradle которое имеет эти метки в теге приложения Manifest, может вызвать эту проблему, и замена их в вашем Manifest является решением.