Android Manifest merger failedВысокая

Manifest Merger Failed: причины и решение ошибки сборки Android

Статья подробно разбирает ошибку 'Manifest merger failed', которая возникает при конфликте файлов AndroidManifest.xml. Вы узнаете о главных причинах и получите 4 проверенных способа их устранения, от автоматического до ручного.

Обновлено 16 февраля 2026 г.
10-15 мин
Средняя
FixPedia Team
Применимо к:Android Studio Arctic Fox (2020.3.1) и новееGradle Plugin 7.0+Android SDK 30+

Что означает ошибка Manifest Merger Failed

Ошибка Manifest merger failed — это критическая ошибка времени сборки в Android-проектах, которая останавливает процесс генерации финального AndroidManifest.xml для приложения. Она возникает, когда система слияния манифестов (Manifest Merger) обнаруживает неразрешимый конфликт между элементами из разных источников: вашего основного манифеста (src/main/AndroidManifest.xml), манифестов библиотечных модулей (.aar), флаворов (product flavors) или сборок (build types).

Типичный полный текст ошибки выглядит так:

Error: Manifest merger failed : 
Attribute application@label value=(@string/app_name) from AndroidManifest.xml:... is also present at 
AndroidManifest.xml:... value=(@string/other_name) 
Suggestion: add 'tools:replace="android:label"' to <application> element at AndroidManifest.xml:... to override

Конфликт может касаться любых атрибутов: android:icon, android:label, activity#name, uses-permission, meta-data и других.

Причины возникновения

Ошибка вызвана строгими правилами слияния XML-документов. Основные причины:

  1. Дублирование элемента с одинаковым именем. Две или более библиотеки/модули объявляют <activity>, <service> или <provider> с одинаковым атрибутом android:name.
  2. Конфликт значений атрибута. Один и тот же атрибут (например, android:allowBackup у <application>) имеет разные значения в разных манифестах.
  3. Несовместимость applicationId. В многомодульном проекте разные модули могут претендовать на основной пакет.
  4. Конфликт разрешений (uses-permission). Две библиотеки запрашивают одно и то же разрешение с разными уровнями maxSdkVersion или android:required.
  5. Повторное объявление компонента. Ваш манифест уже содержит <activity>, которую добавляет подключенная AAR-библиотека (например, Firebase, Google Play Services).

Способы решения

Способ 1: Использование tools:replace (основной)

Это самый частый и точечный способ. Вы явно указываете merger, какой атрибут из вашего манифеста имеет приоритет.

  1. Определите конфликтующий атрибут из полного сообщения об ошибке (например, android:label).
  2. Откройте ваш основной AndroidManifest.xml (обычно app/src/main/AndroidManifest.xml).
  3. Найдите элемент, который вызывает конфликт (чаще всего <application> или конкретный <activity>).
  4. Добавьте пространство имён tools в корневой элемент <manifest>, если его нет:
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              package="com.example.app">
    
  5. Добавьте атрибут tools:replace к конфликтующему элементу, указав через запятую все конфликтующие атрибуты:
    <application
        android:label="@string/app_name"
        android:icon="@mipmap/ic_launcher"
        tools:replace="android:label, android:icon">
        ...
    </application>
    
  6. Выполните чистую сборку: Build -> Clean Project, затем Build -> Rebuild Project.

Способ 2: Удаление конфликтующего элемента (tools:node='remove')

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

  1. Определите полный путь и имя элемента, который нужно удалить (из ошибки).
  2. В вашем манифесте объявите этот же элемент с атрибутом tools:node='remove':
    <!-- Удаляем activity, добавленная библиотекой 'com.example.unwanted:lib' -->
    <activity
        android:name="com.example.unwanted.SomeActivity"
        tools:node="remove" />
    
    Важно: android:name должно точно совпадать с тем, что указано в ошибке.

Способ 3: Настройка зависимостей в Gradle

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

  1. Откройте файл build.gradle модуля app.
  2. Найдите секцию dependencies.
  3. Принудительно задайте версию для проблемной библиотеки, используя implementation с версией или resolutionStrategy:
    dependencies {
        // Явно указываем единую версию
        implementation 'com.google.android.material:material:1.12.0'
        // Или используем forced для всех зависимостей
        configurations.all {
            resolutionStrategy {
                force 'com.some.library:conflicting-lib:1.2.3'
            }
        }
    }
    
  4. Синхронизируйте проект (кнопка 'Sync Now' в строке Gradle).

Способ 4: Глубокий анализ с помощью gradle команды

Для сложных случаев, когда ошибка не указывает конкретный файл, используйте детальный лог.

  1. Запустите сборку с максимальной детализацией из терминала (в корне проекта):
    ./gradlew assembleDebug --info --stacktrace
    
  2. Ищите в выводе блок Merging manifest или Manifest merger. Там будут перечислены все обрабатываемые файлы манифестов.
  3. Найдите два файла, которые определяют один и тот же элемент. Обычно это AndroidManifest.xml из вашего модуля и из папки build/intermediates/merged_manifests/... или .aar файлов в build/.
  4. Вручную исправьте конфликт, используя способы 1 или 2.

Профилактика

  • Версии библиотек. Держите зависимости в актуальном и совместимом состоянии. Используйте ./gradlew dependencies для анализа дерева зависимостей.
  • Структура проекта. Избегайте дублирования <application> атрибутов в разных build.gradle (flavors/build-types). Выносите общие атрибуты в main манифест.
  • Кастомные разрешения. Если вы добавляете uses-permission, проверьте, нет ли его уже в библиотеках.
  • Именование компонентов. Для собственных Activity, Service, Receiver используйте полные имена (с пакетом) или уникальные имена, чтобы минимизировать риск совпадения.
  • Регулярные чистые сборки. Периодически выполняйте Build -> Clean Project, особенно после серьёзных изменений в зависимостях.

Часто задаваемые вопросы (FAQ)

❓ Конфликт возникает из-за библиотеки, которой нет в dependencies. Что делать?

Иногда транзитивная зависимость подтягивается через другую библиотеку. Найдите источник с помощью команды ./gradlew :app:dependencies и используйте exclude:

implementation('com.some:library:1.0') {
    exclude group: 'com.conflicting', module: 'bad-lib'
}

❓ Ошибка Attribute meta-data#android.support.VERSION value=... already defined. Как исправить?

Это классический конфликт версий библиотек поддержки (AndroidX). Убедитесь, что все библиотеки используют одну и ту же версию androidx.*:androidx.*:1.0.0 или com.android.support:appcompat-v7:28.0.0. Включите android.useAndroidX=true и android.enableJetifier=true в gradle.properties.

❓ Manifest merger failed с флавором (flavor). Где искать?

Конфликт может быть между манифестом main и манифестом конкретного флавара (например, src/free/AndroidManifest.xml). Проверьте оба. Решение — вынести общие элементы в main, а специфичные для флавара оставить в его манифесте, используя tools:replace при необходимости.

❓ После исправления ошибка остаётся. Почему?

  1. Кэш Gradle. Выполните File -> Invalidate Caches and Restart... в Android Studio.
  2. Не та версия. Убедитесь, что вы редактировали манифест в правильном sourceSet (main, debug, flavorName).
  3. Ошибка в другом месте. Возможно, есть второй конфликт. Внимательно прочитайте весь стек ошибки до конца.

Часто задаваемые вопросы

Почему появляется ошибка Manifest merger failed после добавления новой библиотеки?
Как быстро найти строку, вызывающую конфликт?
Можно ли отключить слияние манифеста?
Что делать, если конфликт из-за `applicationId` в разных модулях?

Полезное

Анализ полного сообщения об ошибке
Использование атрибута `tools:replace`
Исключение манифеста библиотеки
Проверка и синхронизация зависимостей