it-swarm.com.ru

Ошибка слияния манифеста

Я в процессе переноса своих огромных приложений в Android Studio и Gradle. В настоящее время я застрял в следующем вопросе:

Error:(87, 9) Execution failed for task ':App:processDebugManifest'.
> Manifest merger failed : Attribute [email protected] 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

Я попытался добавить следующие атрибуты в основной файл AndroidManifest.xml:

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

Ни одно из этих определений атрибутов не работает. Что я делаю неправильно?

48
James King

Попробуйте это:

Добавьте это к <manifest/>

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

Добавьте это к <application/>

tools:node="replace"

Основываясь на это , он должен переопределить все элементы. Msgstr "Заменить объявление с более низким приоритетом на аннотированное."

125
Kayvan N

Фон

Когда файлы манифеста объединяются, возникает конфликт с атрибутом label

В общем случае существует три типа файлов манифеста, которые необходимо объединить в один результирующий манифест приложения, здесь в порядке приоритета:

  1. Особенности продукта и типы сборки, определенные файлы манифеста. 
  2. Основной файл манифеста для приложения. 
  3. Файлы манифеста библиотеки.

Решения

Конфликт может быть решен одним из двух способов:

Удалите конфликтующий ярлык

Удалите конфликтующий атрибут из файла манифеста библиотеки (или более низкого уровня). 

В этом случае Android_APPLICATION:Library:unspecified:9:18 value=(@string/app_name) имеет определенное значение @string/app_name, которое отличается от значения в основном приложении. Так что, если это не требуется, то удалите его - просто удалите Android:label="@string/app_name" из файла AndroidManifest.xml файла библиотеки.

Добавьте атрибут, чтобы разрешить автоматическое разрешение конфликта

Есть несколько специальных маркеров атрибутов (в пространстве имен инструментов), которые можно использовать для выражения конкретного решения о том, как разрешать конфликты.

В этом случае, чтобы явным образом заставить Android:label основного приложения переопределять любые другие (например, файл библиотеки) метки приложения, добавьте определение xmlns:tools="http://schemas.Android.com/tools" к узлу <manifest>, а tools:replace="label" к узлу <application>

Вот пример - используйте это в файле AndroidManifest.xml основного приложения:

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

Этот подход также будет работать с любыми другими конфликтующими атрибутами; например, если атрибут icon также находился в конфликте, его можно изменить на tools:replace="label, icon".

32
CJBS

Если вам повезло, как и мне, вы можете вручную решить проблему с помощью хакерского обходного пути. 

Файлы AAR - это просто файлы .Zip с расширением .aar. В моем случае я разархивировал .aar, удалил нарушающий Android:label из AndroidManifest.xml библиотеки, а затем переархивировал оставшиеся файлы с расширением .aar, и все, похоже, отлично работает с новым .aar.

К вашему сведению, это, похоже, известная ошибка в плагине Android gradle .

4
dm78

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

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

Пример здесь

3
stefan K

Я также столкнулся с теми же проблемами, и после долгих исследований нашел душу

  1. ваша минимальная версия SDK должна быть такой же, как и у используемых вами модулей Например: минимальная версия SDK вашего модуля равна 14, а минимальная версия SDK вашего приложения равна 9 Должно быть так же.
  2. Если сборка версии вашего приложения и модулей не совпадает. Опять то же самое должно

Короче говоря, файл и манифест вашего приложения build.gradle должны иметь одинаковые конфигурации

  1. Там нет дублирования, как те же разрешения, добавленные в файл манифеста дважды, одна и та же активность упоминается дважды
  2. Если вы удалили какое-либо действие из вашего проекта, удалите его из файла манифеста.
  3. Иногда это из-за метки, значка и т.д. Тег файла манифеста а) добавить строку xmlns: tools в тег манифеста б) добавить инструменты: replace = или tools: ignore = в тег приложения Пример
   <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>

Принимая во внимание эти моменты, вы избавитесь от этой проблемы с манифестом слияния Проверьте мой пост: эта проблема связана с проблемой в файле манифеста или файла build.gradle. Вы можете проверить мой пост https://wordpress.com/post/dhingrakimmi.wordpress.com/23

0
Kimmi Dhingra

Я только что удалил 

Android:label="@string/app_name

из manifest file и все заработало!

0
itzo