Ответ
AndroidManifest.xml обрабатывается инструментом AAPT (Android Asset Packaging Tool) во время сборки приложения. Он парсит манифест, проверяет его корректность и упаковывает в APK/AAB.
Во время выполнения приложения манифест читается системой Android (PackageManager), которая извлекает из него метаданные: компоненты, разрешения, фичи и т. д.
Пример использования в коде:
val packageInfo = packageManager.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES)
val activities = packageInfo.activities // Список активностей из манифеста
Нюансы:
- AAPT2 (новая версия) добавляет оптимизации, например, удаление неиспользуемых ресурсов.
- Некоторые теги (например,
<uses-library>) обрабатываются только во время выполнения.
Ответ 18+ 🔞
А, ну это же классика, ёпта! Смотри, тут всё просто, как три копейки. Есть у тебя этот AndroidManifest.xml — ну, священный свиток твоего приложения, где всё прописано: кто, что и как может делать.
Пока ты собираешь апку, за него берётся AAPT (или его более крутой младший брат AAPT2). Этот чувак — настоящий грузчик на складе. Он твой манифест вычитывает, проверяет, всё ли на месте, не забыл ли ты штаны надеть (то есть, объявить активити), и аккуратно запаковывает его в готовый APK или AAB. AAPT2 ещё и оптимизатор хитрый — может лишние ресурсы выкинуть, которые ты импортировал, но нихуя не используешь. Умная жопа, короче.
А вот когда приложение уже запустилось на устройстве, в дело вступает сама система Android, а точнее — PackageManager. Это уже не грузчик, а скорее начальник охраны на проходной. Он вытаскивает твой запакованный манифест, смотрит в него и говорит: «Ага, так-так... У этого гражданина есть активность MainActivity, он просит доступ к камере и хочет интернет. Понял, пропускаю». Все метаданные — разрешения, компоненты, фичи — система читает именно оттуда.
Вот, например, если тебе в коде вдруг понадобится узнать, что же ты такого понаобъявлял, можно спросить у того же PackageManager:
val packageInfo = packageManager.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES)
val activities = packageInfo.activities // Вот они, все твои объявленные активности, получай
Но есть нюанс, Карл! Не всё, что в манифесте, обрабатывается при сборке. Некоторые штуки живут только в рантайме. Вот смотри, тег <uses-library> — он же про то, какие сторонние библиотеки нужны твоему приложению на конкретном устройстве. AAPT на него посмотрит, пожмёт плечами и скажет: «Чувак, это не моё дело, разбирайтесь там на месте при запуске». Система уже сама решит, есть ли эта библиотека и нужно ли её подгружать.
Так что запомни: сборка — это AAPT, выполнение — это система. Два разных этапа, и манифест на каждом из них читают, как досье, но с разными целями. Всё гениальное просто, блядь.