Обзор манифеста приложения

Каждый проект приложения должен иметь файл AndroidManifest.xml , с точно таким же именем, в корне исходного набора проекта . Файл манифеста описывает важную информацию о вашем приложении для инструментов сборки Android, операционной системы Android и Google Play.

Помимо прочего, в файле манифеста должно быть указано следующее:

  • Компоненты приложения, включая все действия, службы, приемники вещания и поставщики контента. Каждый компонент должен определять основные свойства, такие как имя его класса Kotlin или Java. Он также может объявлять возможности, такие как конфигурации устройств, которые он может обрабатывать, и фильтры намерений, которые описывают, как компонент может быть запущен. Подробнее о компонентах приложения читайте в следующем разделе.
  • Разрешения, необходимые приложению для доступа к защищенным частям системы или другим приложениям. Он также объявляет любые разрешения, которые должны быть у других приложений, если они хотят получить доступ к контенту этого приложения. Подробнее о разрешениях читайте в следующем разделе.
  • Аппаратные и программные функции, необходимые приложению, которые влияют на то, какие устройства могут установить приложение из Google Play. Подробнее о совместимости устройств читайте в следующем разделе.

Если вы используете Android Studio для создания своего приложения, файл манифеста создается автоматически, и большинство основных элементов манифеста добавляются по мере создания приложения, особенно при использовании шаблонов кода .

Характеристики файла

В следующих разделах описывается, как некоторые из наиболее важных характеристик вашего приложения отражаются в файле манифеста.

Компоненты приложения

Для каждого компонента приложения , который вы создаете в своем приложении, объявите соответствующий элемент XML в файле манифеста:

Если вы создадите подкласс любого из этих компонентов, не объявив его в файле манифеста, система не сможет его запустить.

Укажите имя вашего подкласса с атрибутом name , используя полное обозначение пакета. Например, подкласс Activity объявляется следующим образом:

<manifest ... >
    <application ... >
        <activity android:name="com.example.myapp.MainActivity" ... >
        </activity>
    </application>
</manifest>

Однако если первый символ в значении name — точка, то пространство имен приложения из свойства namespace файла build.gradle на уровне модуля добавляется к имени. Например, если пространство имен — "com.example.myapp" , следующее имя активности разрешается в com.example.myapp.MainActivity :

<manifest ... >
    <application ... >
        <activity android:name=".MainActivity" ... >
            ...
        </activity>
    </application>
</manifest>

Дополнительную информацию о настройке имени пакета или пространства имен см. в разделе Настройка пространства имен .

Если у вас есть компоненты приложения, которые находятся в подпакетах, например, в com.example.myapp.purchases , то значение name должно добавлять отсутствующие имена подпакетов, например, ".purchases.PayActivity" , или использовать полное имя пакета.

Фильтры намерений

Действия приложения, службы и приемники вещания активируются намерениями . Намерение — это сообщение, определяемое объектом Intent , которое описывает действие, которое необходимо выполнить, включая данные, над которыми необходимо выполнить действие, категорию компонента, который, как ожидается, выполнит действие, и другие инструкции.

Когда приложение выдает намерение системе, система находит компонент приложения, который может обработать намерение на основе деклараций фильтра намерений в файле манифеста каждого приложения. Система запускает экземпляр соответствующего компонента и передает объект Intent этому компоненту. Если более одного приложения могут обработать намерение, то пользователь может выбрать, какое приложение использовать.

Компонент приложения может иметь любое количество фильтров намерений (определяемых с помощью элемента <intent-filter> ), каждый из которых описывает отдельную возможность этого компонента.

Более подробную информацию см. в документе «Намерения и фильтры намерений» .

Значки и этикетки

Ряд элементов манифеста имеют атрибуты icon и label для отображения пользователям небольшого значка и текстовой метки соответствующего компонента приложения.

В каждом случае значок и метка, которые установлены в родительском элементе, становятся icon и label по умолчанию для всех дочерних элементов. Например, значок и метка, которые установлены в элементе <application> , являются значком и меткой по умолчанию для каждого из компонентов приложения, таких как все действия.

Значок и метка, которые установлены в <intent-filter> компонента, отображаются пользователю всякий раз, когда этот компонент представлен как вариант для выполнения намерения. По умолчанию этот значок наследуется от любого значка, объявленного для родительского компонента, либо элемента <activity> , либо <application> .

Вы можете изменить значок для фильтра намерений, если он предоставляет уникальное действие, которое вы хотели бы лучше обозначить в диалоговом окне выбора. Для получения дополнительной информации см. Разрешить другим приложениям запускать вашу активность .

Разрешения

Приложения Android должны запрашивать разрешение на доступ к конфиденциальным данным пользователя, таким как контакты и SMS, или определенным системным функциям, таким как камера и доступ в Интернет. Каждое разрешение идентифицируется уникальной меткой. Например, приложение, которому необходимо отправлять SMS-сообщения, должно иметь следующую строку в манифесте:

<manifest ... >
    <uses-permission android:name="android.permission.SEND_SMS"/>
    ...
</manifest>

Начиная с Android 6.0 (уровень API 23) пользователь может одобрить или отклонить некоторые разрешения приложения во время выполнения. Но независимо от того, какую версию Android поддерживает ваше приложение, вы должны объявить все запросы разрешений с помощью элемента <uses-permission> в манифесте. Если разрешение предоставлено, приложение может использовать защищенные функции. Если нет, его попытки получить доступ к этим функциям терпят неудачу.

Ваше приложение также может защищать свои собственные компоненты с помощью разрешений. Оно может использовать любые разрешения, определенные Android, как указано в android.Manifest.permission , или разрешение, объявленное в другом приложении. Ваше приложение также может определять свои собственные разрешения. Новое разрешение объявляется с помощью элемента <permission> .

Более подробную информацию см. в разделе Разрешения на Android .

Совместимость устройств

Файл манифеста также является местом, где вы можете объявить, какие типы аппаратных или программных функций требуются вашему приложению и, соответственно, с какими типами устройств совместимо ваше приложение. Google Play Store не позволяет пользователям устанавливать ваше приложение на устройства, которые не предоставляют функции или версию системы, требуемые вашим приложением.

Существует несколько тегов манифеста, которые определяют, с какими устройствами совместимо ваше приложение. Ниже приведены некоторые из наиболее распространенных.

<использование-функции>

Элемент <uses-feature> позволяет вам объявлять аппаратные и программные функции, необходимые вашему приложению. Например, если ваше приложение не может достичь базовой функциональности на устройстве без датчика компаса, вы можете объявить датчик компаса как требуемый с помощью следующего тега манифеста:

<manifest ... >
    <uses-feature android:name="android.hardware.sensor.compass"
                  android:required="true" />
    ...
</manifest>

Примечание : Если вы хотите сделать свое приложение доступным на Chromebook, следует учитывать некоторые важные ограничения аппаратных и программных функций. Для получения дополнительной информации см. Совместимость манифеста приложения для Chromebooks .

<использует-sdk>

Каждая последующая версия платформы часто добавляет новые API, недоступные в предыдущей версии. Чтобы указать минимальную версию, с которой совместимо ваше приложение, ваш манифест должен включать тег <uses-sdk> и его атрибут minSdkVersion .

Однако имейте в виду, что атрибуты в элементе <uses-sdk> переопределяются соответствующими свойствами в файле build.gradle . Поэтому, если вы используете Android Studio, укажите значения minSdkVersion и targetSdkVersion там:

Круто

android {
    defaultConfig {
        applicationId 'com.example.myapp'

        // Defines the minimum API level required to run the app.
        minSdkVersion 21

        // Specifies the API level used to test the app.
        targetSdkVersion 33
        ...
    }
}

Котлин

android {
    defaultConfig {
        applicationId = "com.example.myapp"

        // Defines the minimum API level required to run the app.
        minSdkVersion(21)

        // Specifies the API level used to test the app.
        targetSdkVersion(33)
        ...
    }
}

Для получения дополнительной информации о файле build.gradle прочитайте о том, как настроить сборку .

Дополнительную информацию о том, как объявить о поддержке вашего приложения различными устройствами, см. в разделе Обзор совместимости устройств .

Соглашения о файлах

В этом разделе описываются соглашения и правила, которые обычно применяются ко всем элементам и атрибутам в файле манифеста.

Элементы
Обязательны только элементы <manifest> и <application> . Каждый из них должен встречаться только один раз. Большинство других элементов могут встречаться ноль или более раз. Однако некоторые из них должны присутствовать, чтобы сделать файл манифеста полезным.

Все значения задаются через атрибуты, а не как символьные данные внутри элемента.

Элементы на одном уровне обычно не упорядочены. Например, элементы <activity> , <provider> и <service> могут быть размещены в любом порядке. Из этого правила есть два ключевых исключения:

  • Элемент <activity-alias> должен следовать за <activity> , для которого он является псевдонимом.
  • Элемент <application> должен быть последним элементом внутри элемента <manifest> .
Атрибуты
Технически все атрибуты являются необязательными. Однако многие атрибуты должны быть указаны, чтобы элемент мог выполнить свое назначение. Для действительно необязательных атрибутов справочная документация указывает значения по умолчанию.

За исключением некоторых атрибутов корневого элемента <manifest> , все имена атрибутов начинаются с префикса android: например, android:alwaysRetainTaskState . Поскольку префикс является универсальным, документация обычно опускает его при ссылке на атрибуты по имени.

Множественные значения
Если можно указать более одного значения, элемент почти всегда повторяется, а не несколько значений, перечисленных в одном элементе. Например, фильтр намерений может перечислять несколько действий:
<intent-filter ... >
    <action android:name="android.intent.action.EDIT" />
    <action android:name="android.intent.action.INSERT" />
    <action android:name="android.intent.action.DELETE" />
    ...
</intent-filter>
Ценность ресурсов
Некоторые атрибуты имеют значения, которые отображаются для пользователей, например, заголовок действия или значок вашего приложения. Значение этих атрибутов может отличаться в зависимости от языка пользователя или других конфигураций устройства (например, для предоставления другого размера значка в зависимости от плотности пикселей устройства), поэтому значения следует устанавливать из ресурса или темы, а не жестко задавать в файле манифеста. Фактическое значение затем может меняться в зависимости от альтернативных ресурсов , которые вы предоставляете для различных конфигураций устройства.

Ресурсы выражаются в виде значений в следующем формате:

"@[ package :] type / name "

Вы можете опустить имя package , если ресурс предоставляется вашим приложением (включая, если он предоставляется зависимостью библиотеки, поскольку ресурсы библиотеки объединены с вашими ). ​​Единственное другое допустимое имя пакета — android , когда вы хотите использовать ресурс из фреймворка Android.

type — это тип ресурса, например string или drawable , а name — это имя, которое идентифицирует конкретный ресурс. Вот пример:

<activity android:icon="@drawable/smallPic" ... >

Дополнительную информацию о том, как добавлять ресурсы в проект, читайте в разделе Обзор ресурсов приложения .

Чтобы вместо этого применить значение, определенное в теме , первым символом должен быть ? вместо @ :

"?[ package :] type / name "

Строковые значения
Если значение атрибута представляет собой строку, используйте двойную обратную косую черту ( \\ ) для экранирования символов, например \\n для новой строки или \\uxxxx для символа Unicode.

Ссылка на элементы манифеста

В следующей таблице приведены ссылки на справочные документы для всех допустимых элементов в файле AndroidManifest.xml .

<action> Добавляет действие к фильтру намерений.
<activity> Объявляет компонент активности.
<activity-alias> Объявляет псевдоним для действия.
<application> Объявляет приложение.
<category> Добавляет название категории в фильтр намерений.
<compatible-screens> Указывает каждую конфигурацию экрана, с которой совместимо приложение.
<data> Добавляет спецификацию данных в фильтр намерений.
<grant-uri-permission> Указывает подмножества данных приложения, к которым родительский поставщик контента имеет разрешение на доступ.
<instrumentation> Объявляет класс Instrumentation , позволяющий отслеживать взаимодействие приложения с системой.
<intent-filter> Указывает типы намерений, на которые может реагировать действие, служба или приемник вещания.
<manifest> Корневой элемент файла AndroidManifest.xml .
<meta-data> Пара имя-значение для элемента дополнительных произвольных данных, которые могут быть предоставлены родительскому компоненту.
<path-permission> Определяет путь и требуемые разрешения для определенного подмножества данных в поставщике контента.
<permission> Объявляет разрешение безопасности, которое может использоваться для ограничения доступа к определенным компонентам или функциям этого или других приложений.
<permission-group> Объявляет имя для логической группы связанных разрешений.
<permission-tree> Объявляет базовое имя для дерева разрешений.
<provider> Объявляет компонент поставщика контента.
<queries> Объявляет набор других приложений, к которым ваше приложение намерено получить доступ. Узнайте больше в руководстве о фильтрации видимости пакетов .
<receiver> Объявляет компонент широковещательного приемника.
<service> Объявляет компонент службы.
<supports-gl-texture> Объявляет единый формат сжатия текстур GL, поддерживаемый приложением.
<supports-screens> Объявляет поддерживаемые вашим приложением размеры экрана и включает режим совместимости с экранами, размер которых больше, чем поддерживает ваше приложение.
<uses-configuration> Указывает конкретные входные характеристики, необходимые приложению.
<uses-feature> Объявляет отдельную аппаратную или программную функцию, используемую приложением.
<uses-library> Указывает общую библиотеку, с которой должно быть связано приложение.
<uses-native-library> Указывает предоставленную поставщиком собственную общую библиотеку, с которой должно быть связано приложение.
<uses-permission> Указывает системное разрешение, которое пользователь должен предоставить для корректной работы приложения.
<uses-permission-sdk-23> Указывает, что приложению требуется определенное разрешение, но только если приложение установлено на устройстве под управлением Android 6.0 (уровень API 23) или выше.
<uses-sdk> Позволяет выразить совместимость приложения с одной или несколькими версиями платформы Android с помощью целого числа уровня API.

Пределы

Следующие теги имеют ограничение на количество появлений в файле манифеста:

Имя тега Предел
<package> 1000
<meta-data> 1000
<uses-library> 1000

Следующие атрибуты имеют ограничение на максимальную длину:

Атрибут Предел
name 1024
versionName 1024
host 255
mimeType 255

Пример файла манифеста

Приведенный ниже XML-код представляет собой простой пример 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">

    <!-- Beware that these values are overridden by the build.gradle file -->
    <uses-sdk android:minSdkVersion="15" android:targetSdkVersion="26" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <!-- This name is resolved to com.example.myapp.MainActivity
             based on the namespace property in the build.gradle file -->
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:name=".DisplayMessageActivity"
            android:parentActivityName=".MainActivity" />
    </application>
</manifest>