Кто обрабатывает AndroidManifest.xml
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Кто обрабатывает AndroidManifest.xml
AndroidManifest.xml — это конфигурационный файл каждого Android приложения, который обрабатывается Android Package Manager (пакетным менеджером Android) на разных этапах разработки и выполнения.
Этапы обработки
1. Время разработки (Build Time)
Gradle/AGP (Android Gradle Plugin)
Android Gradle Plugin обрабатывает AndroidManifest.xml при сборке приложения:
android {
compileSdkVersion 33
defaultConfig {
applicationId "com.example.app"
minSdkVersion 24
targetSdkVersion 33
}
}
AGP:
- Валидирует синтаксис XML
- Слияние манифестов (manifest merging) из разных модулей
- Подставляет значения из build.gradle
- Генерирует R класс с идентификаторами ресурсов
Manifest Merging
Когда приложение использует библиотеки, их манифесты объединяются:
<!-- App manifest -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- Library manifest -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- Результат слияния -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
Правила слияния можно контролировать:
<manifest xmlns:tools="http://schemas.android.com/tools">
<activity
android:name=".MainActivity"
tools:replace="android:theme"
android:theme="@style/AppTheme" />
</manifest>
2. Время установки (Installation Time)
Package Manager (PackageManagerService)
Когда приложение устанавливается на устройство, Package Manager обрабатывает манифест:
apk установка → Package Manager парсит манифест
↓
Регистрирует компоненты (Activities, Services, BroadcastReceivers)
↓
Проверяет разрешения
↓
Создаёт записи в системной БД
- Парсит и валидирует XML
- Регистрирует все компоненты
- Устанавливает разрешения
- Создаёт запись в файловой системе
3. Время выполнения (Runtime)
ActivityManagerService (AMS)
Когда приложение запускается, ActivityManagerService читает манифест для запуска компонентов:
// Когда вызывается startActivity()
val intent = Intent(this, MainActivity::class.java)
startActivity(intent)
// AMS:
// 1. Проверяет манифест
// 2. Находит MainActivity в манифесте
// 3. Проверяет разрешения
// 4. Создаёт Activity инстанс
Содержимое AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="1"
android:versionName="1.0"
package="com.example.myapp">
<!-- Разрешения -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<!-- Функции устройства (опционально) -->
<uses-feature android:name="android.hardware.camera" />
<!-- Приложение -->
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<!-- Activity -->
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- Service -->
<service
android:name=".MyService"
android:exported="false" />
<!-- BroadcastReceiver -->
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<!-- ContentProvider -->
<provider
android:name=".MyProvider"
android:authorities="com.example.myapp.provider"
android:exported="false" />
</application>
</manifest>
Система разрешений
Package Manager обрабатывает разрешения:
<!-- Объявление разрешения -->
<uses-permission android:name="android.permission.CAMERA" />
На Android 6.0+ требуется runtime запрос:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
// Запрос разрешения
ActivityCompat.requestPermissions(
this,
arrayOf(Manifest.permission.CAMERA),
CAMERA_REQUEST_CODE
)
}
Intent Filters
Package Manager использует intent filters для определения компонентов:
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Когда вызывается:
val intent = Intent(Intent.ACTION_MAIN)
intent.addCategory(Intent.CATEGORY_LAUNCHER)
startActivity(intent)
Package Manager ищет компоненты с совпадающим intent filter.
ProcessResolving
Package Manager разрешает интенты в компоненты:
// Явный интент (точно знаем компонент)
val explicit = Intent(this, MainActivity::class.java)
// Неявный интент (ищет по intent filter)
val implicit = Intent(Intent.ACTION_VIEW)
implicit.data = Uri.parse("https://example.com")
// Package Manager найдёт браузер
Exported атрибут (Android 12+)
Package Manager требует явного указания, экспортирован ли компонент:
<!-- Android 12+: нужно указать android:exported -->
<activity
android:name=".MainActivity"
android:exported="true"> <!-- видна другим приложениям -->
...
</activity>
<service
android:name=".MyService"
android:exported="false" /> <!-- только для текущего приложения -->
Инструменты для анализа
aapt (Android Asset Packaging Tool)
aapt dump manifest app-release.apk
Выводит распарсенный манифест.
bundletool
bundletool dump manifest --bundle=app.aab
Процесс сборки
AndroidManifest.xml
↓
AGP (Gradle)
↓
Manifest Merging (библиотеки)
↓
Resource Processing
↓
Packaging (APK/AAB)
↓
Package Manager (при установке)
↓
Runtime (ActivityManagerService)
Best Practices
- Используй
android:exported="false"по умолчанию для безопасности - Объявляй разрешения явно в манифесте
- Используй intent filters правильно
- Проверяй манифест merging errors при добавлении библиотек
- Не забывай про Android версии и целевые SDK
Итого
AndroidManifest.xml обрабатывается:
- Gradle (AGP) при сборке
- Package Manager при установке
- ActivityManagerService при запуске приложения
Это ключевой файл, который связывает приложение с системой и определяет всё поведение на системном уровне.