Что такое merged manifest?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое Merged Manifest?
Merged Manifest (слитый/объединенный манифест) — это финальный файл AndroidManifest.xml, который система сборки Android (в частности, плагин Android для Gradle) формирует автоматически путем объединения манифеста вашего основного приложения (app module) с манифестами всех подключенных библиотек, зависимостей и модулей. Этот процесс происходит на этапе сборки APK или AAB перед компиляцией ресурсов и кодогенерацией.
Как работает процесс слияния
Система сборки выполняет следующие шаги:
-
Сбор всех исходных манифестов:
- Основной манифест из
app/src/main/AndroidManifest.xml - Манифесты из локенных модулей (например,
:feature) - Манифесты из AAR-библиотек и remote-зависимостей (например, Firebase, Room)
- Манифесты, сгенерированные аннотациями или плагинами
- Основной манифест из
-
Применение правил слияния с помощью Merger Tool:
- Разрешение конфликтов на основе приоритетов и атрибутов
- Объединение разрешений, компонентов, метаданных
- Валидация корректности итогового манифеста
-
Создание конечного файла, который помещается в
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
- Откройте вкладку "Merged Manifest" в редакторе манифеста
- Видите иерархическую структуру с цветовой маркировкой:
- Зеленый: элементы из основного модуля
- Синий: элементы из библиотек
- Красный: конфликты или ошибки
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 -->
Практическое значение для разработчика
- Отладка проблем: многие ошибки сборки ("Manifest merger failed") связаны с конфликтами при слиянии
- Безопасность: контроль над
android:exported, разрешениями - Конфигурация сборок: разные merged manifest для разных build variants (debug/release)
- Минимизация APK: удаление ненужных компонентов из библиотек через
tools:node="remove"
Пример решения конфликта
Если библиотека добавляет нежелательное разрешение:
<!-- В основном манифесте добавляем: -->
<uses-permission
android:name="com.example.library.UNNECESSARY_PERMISSION"
tools:node="remove" />
Merged manifest — это мощный механизм, который избавляет разработчика от ручного копирования объявлений из библиотек, но требует понимания его работы для эффективного решения конфликтов и тонкой настройки финальной конфигурации приложения. Всегда проверяйте merged manifest перед выпуском сборки, особенно при добавлении новых зависимостей или обновлении существующих.