← Назад к вопросам

Что такое merged manifest?

2.2 Middle🔥 101 комментариев
#Android компоненты#Многомодульность

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Merged Manifest?

Merged Manifest (слитый/объединенный манифест) — это финальный файл AndroidManifest.xml, который система сборки Android (в частности, плагин Android для Gradle) формирует автоматически путем объединения манифеста вашего основного приложения (app module) с манифестами всех подключенных библиотек, зависимостей и модулей. Этот процесс происходит на этапе сборки APK или AAB перед компиляцией ресурсов и кодогенерацией.

Как работает процесс слияния

Система сборки выполняет следующие шаги:

  1. Сбор всех исходных манифестов:

    • Основной манифест из app/src/main/AndroidManifest.xml
    • Манифесты из локенных модулей (например, :feature)
    • Манифесты из AAR-библиотек и remote-зависимостей (например, Firebase, Room)
    • Манифесты, сгенерированные аннотациями или плагинами
  2. Применение правил слияния с помощью Merger Tool:

    • Разрешение конфликтов на основе приоритетов и атрибутов
    • Объединение разрешений, компонентов, метаданных
    • Валидация корректности итогового манифеста
  3. Создание конечного файла, который помещается в build/intermediates/merged_manifests/{variant}/AndroidManifest.xml

Пример конфликта и его разрешения

Допустим, основное приложение и библиотека объявляют одну активность с разными атрибутами:

Основной манифест:

<activity
    android:name=".MainActivity"
    android:screenOrientation="portrait"
    android:theme="@style/AppTheme">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
    </intent-filter>
</activity>

Манифест библиотеки:

<activity
    android:name="com.example.library.LibActivity"
    android:screenOrientation="landscape"
    android:configChanges="orientation">
</activity>

В merged manifest оба элемента <activity> сохранятся как есть, поскольку их android:name различаются. Однако если бы имя было одинаковым, инструмент слияния применил бы правила:

  • Атрибуты из основного манифеста имеют высший приоритет
  • Элементы <intent-filter> объединяются (добавляются)
  • Конфликтующие атрибуты могут потребовать явного разрешения

Типичные проблемы и их решение

1. Конфликт атрибутов android:icon или android:label

<!-- В merged manifest будет использовано значение из app module -->
<application
    android:icon="@mipmap/ic_launcher"      <!-- из app -->
    android:label="@string/app_name"        <!-- из app -->
    android:theme="@style/LibTheme">        <!-- из библиотеки, если в app не указано -->
</application>

2. Дублирование разрешений

Если несколько модулей объявляют <uses-permission>, в merged manifest останется одна запись.

3. Конфликт android:exported в компонентах

Начиная с Android 12, все компоненты с <intent-filter> должны явно указывать android:exported. При слиянии может возникнуть ошибка, которую нужно исправить вручную.

Инструменты для анализа

Просмотр merged manifest в Android Studio

  1. Откройте вкладку "Merged Manifest" в редакторе манифеста
  2. Видите иерархическую структуру с цветовой маркировкой:
    • Зеленый: элементы из основного модуля
    • Синий: элементы из библиотек
    • Красный: конфликты или ошибки

Gradle задачи

./gradlew processDebugManifest
# Итоговый файл: app/build/intermediates/merged_manifests/debug/AndroidManifest.xml

Правила слияния (Markers и Selectors)

Система использует специальные атрибуты для управления процессом:

<!-- tools:node="merge" - объединить атрибуты (по умолчанию) -->
<!-- tools:node="replace" - полностью заменить элемент -->
<!-- tools:node="remove" - удалить этот элемент из конечного манифеста -->
<!-- tools:node="removeAll" - удалить все элементы этого типа из библиотек -->

<uses-permission
    android:name="android.permission.CAMERA"
    tools:node="remove" />  <!-- Исключит это разрешение из merged manifest -->

Практическое значение для разработчика

  1. Отладка проблем: многие ошибки сборки ("Manifest merger failed") связаны с конфликтами при слиянии
  2. Безопасность: контроль над android:exported, разрешениями
  3. Конфигурация сборок: разные merged manifest для разных build variants (debug/release)
  4. Минимизация APK: удаление ненужных компонентов из библиотек через tools:node="remove"

Пример решения конфликта

Если библиотека добавляет нежелательное разрешение:

<!-- В основном манифесте добавляем: -->
<uses-permission
    android:name="com.example.library.UNNECESSARY_PERMISSION"
    tools:node="remove" />

Merged manifest — это мощный механизм, который избавляет разработчика от ручного копирования объявлений из библиотек, но требует понимания его работы для эффективного решения конфликтов и тонкой настройки финальной конфигурации приложения. Всегда проверяйте merged manifest перед выпуском сборки, особенно при добавлении новых зависимостей или обновлении существующих.

Что такое merged manifest? | PrepBro