AndroidManifest.xml — что это, основные компоненты и конфигурация манифеста

Автор: IT Sectr Опубликовано: 2026-05-31 Время чтения: 8 мин

AndroidManifest.xml — обязательный конфигурационный файл каждого Android приложения, описывающий его компоненты, разрешения и метаданные. Система Android читает этот файл при установке и запуске каждого приложения. По данным Android Developers, 2025, без корректного манифеста приложение не устанавливается на устройство. AndroidManifest.xml регистрирует Activity, Service, BroadcastReceiver и ContentProvider для операционной системы.

Главное

  • AndroidManifest.xml — XML-файл, декларирующий все компоненты и требования Android приложения
  • Activity, Service, BroadcastReceiver, ContentProvider регистрируются внутри тега application
  • Разрешения указываются через теги uses-permission и uses-permission-sdk-23
  • Intent Filters определяют, какие системные действия может обрабатывать каждый компонент
  • Атрибут exported контролирует доступность компонента для других приложений

Что такое AndroidManifest.xml

AndroidManifest.xml — это корневой конфигурационный файл в формате XML, который каждый Android проект обязан содержать в директории app/src/main. Система Android анализирует его до запуска любого кода приложения — на этапе парсинга APK при установке. Если в манифесте есть синтаксическая ошибка или отсутствует обязательное объявление, установка прерывается с сообщением об ошибке.

Файл содержит полную декларацию приложения: список всех компонентов (Activity, Service, BroadcastReceiver, ContentProvider), запрашиваемые разрешения, минимальную версию SDK, аппаратные требования и конфигурацию тем и стилей. Каждый компонент, который может быть вызван системой или другими приложениями, должен быть явно объявлен в манифесте. Это требование безопасности: без явного объявления компонент недоступен для вызова.

Без правильно настроенного манифеста приложение не может быть установлено через Google Play или sideloading. Система проверяет манифест на этапе парсинга APK и отклоняет установку при ошибках. Google Play также сканирует манифест на предмет небезопасных конфигураций: при exported=true на компоненте без intent-filter выдаётся предупреждение, а при отсутствии обязательных разрешений для targetSdk 34+ публикация блокируется. Поэтому понимание структуры манифеста — обязательный навык Android-разработчика.

Компоненты приложения в манифесте

Каждый компонент Android приложения должен быть явно зарегистрирован в манифесте. Это обязательное требование платформы для всех четырёх типов компонентов. Без регистрации компонент не может быть создан системой, и попытка его запуска приведет к исключению ActivityNotFoundException или аналогичному. Компоненты регистрируются внутри тега application в порядке, не влияющем на их работу.

Activity

Тег activity регистрирует экран приложения. Атрибут exported определяет, могут ли другие приложения запускать эту Activity. Начиная с Android 12, отсутствие exported при наличии intent-filter вызывает ошибку сборки — это требование безопасности. Точка входа задаётся через intent-filter с action MAIN и category LAUNCHER. Каждое Activity должно иметь уникальное android:name, соответствующее полному или относительному имени класса.

xml
<activity
    android:name=".MainActivity"
    android:exported="true"
    android:windowSoftInputMode="adjustResize">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

Service

Тег service определяет фоновый сервис. Начиная с Android 8, фоновые службы имеют строгие ограничения: foreground service требует обязательного уведомления с иконкой, видимого пользователю, а bound service живёт только при наличии связанного клиента. Сервисы, работающие в фоне без уведомления, автоматически завершаются системой через несколько минут после перехода приложения в фоновый режим. Для длительных задач используйте WorkManager вместо Service.

xml
<service
    android:name=".SyncService"
    android:exported="false"
    android:foregroundServiceType="dataSync" />

BroadcastReceiver

Тег receiver объявляет приёмник системных или кастомных широковещательных сообщений. Начиная с Android 8, большинство неявных broadcast-рассылок больше не доставляются статически объявленным в манифесте приёмникам. Вместо этого рекомендуется регистрировать приёмники динамически через Context.registerReceiver в коде. Исключение составляют некоторые системные рассылки, например BOOT_COMPLETED, которые по-прежнему требуют статической регистрации в манифесте.

xml
<receiver
    android:name=".ConnectivityReceiver"
    android:exported="true">
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>

Разрешения (Permissions) в Android

Каждое опасное разрешение в Android требует декларации в манифесте через тег uses-permission. Начиная с Android 6, опасные разрешения запрашиваются во время выполнения через диалог с пользователем, но декларация в манифесте остаётся обязательной. Без неё метод requestPermissions выбрасывает исключение SecurityException. Разрешения нормального уровня, такие как INTERNET и ACCESS_NETWORK_STATE, предоставляются автоматически при установке.

РазрешениеНазначение
CAMERAДоступ к камере устройства для фото и видео
ACCESS_FINE_LOCATIONТочная геолокация по GPS и сети
RECORD_AUDIOЗапись звука с микрофона устройства
READ_CONTACTSЧтение контактов из телефонной книги
POST_NOTIFICATIONSОтправка уведомлений на Android 13+

Тег uses-permission-sdk-23 указывает разрешения, необходимые только на Android 6.0+. Это позволяет сохранять совместимость со старыми версиями без запроса несуществующих разрешений. Например, POST_NOTIFICATIONS доступно только на Android 13+, поэтому его нужно указывать через uses-permission-sdk-33, чтобы на более старых устройствах не было ошибки неизвестного разрешения. Атрибут maxSdkVersion в uses-permission позволяет автоматически отзывать ненужные разрешения при обновлении приложения на новых версиях Android.

Разрешения нормального уровня (INTERNET, ACCESS_NETWORK_STATE) предоставляются автоматически при установке и не требуют runtime-запроса. Они также декларируются через uses-permission, но не показываются пользователю в диалоге. Для контроля доступа к компонентам приложения из других приложений используется механизм permission-protected components: можно указать custom permission на уровне Activity или Service, которое будет проверяться системой при вызове компонента извне. Это обеспечивает дополнительный уровень безопасности для межпроцессного взаимодействия.

Intent Filters и диплинки

Тег intent-filter в манифесте объявляет, какие неявные интенты может обрабатывать компонент. Это механизм, через который Android связывает системные или кастомные действия с приложением. Intent filter состоит из трёх элементов: action (действие), category (категория) и data (данные). Все три могут быть скомбинированы для точного описания, какие интенты должен получать компонент. Система выбирает подходящий компонент на основе наиболее специфичного фильтра.

xml
<activity android:name=".DeepLinkActivity">
    <intent-filter android:autoVerify="true">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data
            android:scheme="https"
            android:host="itsectr.com"
            android:pathPrefix="/app" />
    </intent-filter>
</activity>

Атрибут autoVerify включает проверку Android App Links: система связывается с сервером для подтверждения владения доменом. Без верификации диплинки работают через стандартный chooser dialog, где пользователь выбирает, каким приложением открыть ссылку. После успешной верификации ссылки открываются напрямую в приложении без диалога. Google Search Console также использует autoVerify для индексации deep links и отображения их в результатах поиска.

Фильтры с action.VIEW и категориями DEFAULT и BROWSABLE обрабатывают ссылки из браузера, email и других приложений. Это основной механизм реализации диплинков в Android. Для поддержки кастомных URL-схем, например myapp://, достаточно указать scheme без host. Однако Google рекомендует использовать HTTPS-диплинки вместо кастомных схем, так как они более безопасны и не требуют дополнительных разрешений. Кастомные схемы могут быть перехвачены любым приложением, зарегистрировавшим ту же схему.

Атрибуты приложения и метаданные

Корневой тег manifest содержит атрибуты пакета, версии и SDK. Тег application хранит глобальные настройки: тему, иконку, label и флаги отладки. Атрибуты manifest задают версионирование на уровне пакета, а атрибуты application определяют внешний вид и поведение приложения в целом. Значения могут быть ссылками на ресурсы через @-синтаксис или строковыми литералами.

xml
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.itsectr.myapp"

    <uses-sdk
        android:minSdkVersion="24"
        android:targetSdkVersion="34" />

    <application
        android:label="MyApp"
        android:icon="@mipmap/ic_launcher"
        android:theme="@style/Theme.MyApp"
        android:supportsRtl="true"
        android:allowBackup="true">
        <!-- Компоненты приложения -->
    </application>
</manifest>

Тег meta-data внутри application позволяет хранить произвольные пары ключ-значение. Это удобно для конфигурации сторонних библиотек: API-ключей, endpoint-адресов и флагов функциональности. Данные из meta-data доступны через PackageManager.getApplicationInfo().metaData в runtime. Например, Firebase и Google Maps используют meta-data для передачи ключей доступа без жёсткого кодирования в исходном коде. Вместо этого ключи задаются в манифесте и могут отличаться для разных флейворсов сборки.

Атрибут android:extractNativeLibs управляет извлечением нативных библиотек из APK. Для приложений с targetSdk 34+ этот атрибут должен быть явно указан, иначе сборка может упасть с ошибкой INSTALL_FAILED_INVALID_APK. Если extractNativeLibs=false, нативные библиотеки остаются внутри APK без распаковки, что уменьшает размер установленного приложения, но увеличивает время загрузки библиотек. Для большинства современных приложений рекомендуется extractNativeLibs=false для уменьшения занимаемого места на диске пользователя.

Атрибут android:networkSecurityConfig позволяет задать файл конфигурации сетевой безопасности. Это особенно важно для приложений с targetSdk 28+, где HTTP трафик по умолчанию заблокирован. Конфигурационный файл определяет доверенные сертификаты, домены для HTTP-соединений и правила pinning сертификатов. Это заменяет устаревший атрибут android:usesCleartextTraffic и предоставляет более гибкий механизм управления безопасностью соединений на уровне ОС.

Атрибут android:largeHeap запрашивает увеличенный размер кучи для приложения. По умолчанию Android выделяет каждому приложению ограниченный объём памяти, зависящий от устройства и версии ОС. Если приложение работает с тяжёлыми изображениями, видео или большими наборами данных, largeHeap может предотвратить OutOfMemoryError. Однако злоупотребление этим атрибутом вредно: приложение с большим потреблением памяти быстрее завершается системой при нехватке ресурсов. Используйте largeHeap только после профилирования и подтверждения необходимости.

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

Что будет, если не указать exported для Activity?

Начиная с Android 12, отсутствие атрибута exported при наличии intent-filter вызывает ошибку сборки. Система требует явного указания видимости каждого компонента с intent-filter — это мера безопасности для предотвращения случайного открытия компонентов другими приложениями. Для Activity без intent-filter exported по умолчанию false.

Можно ли иметь несколько Activity с intent-filter LAUNCHER?

Да, но в лаунчере отобразится несколько иконок приложения. Каждая Activity с MAIN/LAUNCHER становится отдельной точкой входа. Это используется для создания ярлыков на разные разделы приложения, например для перехода сразу к настройкам или к созданию новой записи. Каждая иконка открывает соответствующую Activity напрямую.

Как работает merge манифестов в Android?

Android объединяет манифесты из библиотек с основным манифестом приложения. При конфликте атрибутов используется tools:replace или tools:node="merge" для разрешения. Этот механизм автоматический: при добавлении библиотеки через Gradle её манифест сливается с главным. Чтобы отменить или заменить атрибут из библиотеки, используйте tools:node="remove" или tools:replace="attributeName".

Почему Permission диалог не показывается?

Типичные причины: разрешение не объявлено в манифесте через uses-permission, используется нормальное разрешение (без runtime-запроса), пользователь выбрал "Больше не спрашивать" и разрешение навсегда запрещено, или targetSdkVersion ниже 23, где разрешения запрашиваются при установке. Для диагностики проверьте манифест и логи через adb logcat.

Что такое debuggable в манифесте?

Атрибут android:debuggable включает отладку приложения через ADB. Для релизных сборок в Google Play он должен быть false. Если debuggable=true в релизной сборке, злоумышленник может подключиться к приложению через ADB, читать данные и выполнять произвольный код. Google Play автоматически блокирует публикацию сборок с debuggable=true.

Итоги

  • AndroidManifest.xml — обязательный конфигурационный файл с декларацией всех компонентов Android приложения
  • Activity, Service, Receiver, Provider регистрируются внутри тега application с атрибутами видимости и конфигурации
  • Разрешения объявляются через uses-permission, опасные запрашиваются в runtime после Android 6.0
  • Intent Filters с autoVerify включают Android App Links для прямых диплинков без диалога выбора
  • uses-sdk задаёт minSdkVersion и targetSdkVersion для контроля совместимости с версиями Android
  • exported обязателен для всех компонентов с intent-filter начиная с Android 12
  • Merge манифестов объединяет конфигурации из модулей и библиотек с поддержкой переопределения атрибутов

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также