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

Каждый проект приложения должен иметь файл 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 не позволяет пользователям устанавливать ваше приложение на устройства, которые не предоставляют функции или версию системы, необходимые вашему приложению.

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

<использует функцию>

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

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

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

<использует-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 для символа Юникода.

Справочник по элементам манифеста

В следующей таблице приведены ссылки на справочные документы для всех допустимых элементов в файле 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>