Раздел: Манифест

Манифест приложения

Каждое приложение должно иметь файл AndroidManifest.xml в корневой директории проекта. Манифест предоставляет важную информацию о приложении системе Android, которую она должна получить прежде чем сможет запустить любой из компонентов. Среди прочего, манифест служит для следующих вещей:

  • Для указания имен Java пакетов приложения. Имя пакета служит уникальным идентификатором приложения.
  • Для описания компонентов приложения - явлений, сервисом, широковещательных приемников и поставщиков содержимого, а также для указания имен классов, которые реализуют каждый из компонентов и публикации их возможностей. Это описание указывает системе Android, какие есть компоненты и при каких условиях они могут быть запущены.
  • Для определения процессов, которые используют компоненты приложения.
  • Для указания разрешений, которые должно иметь приложение, чтобы получить доступ к защищенной части API или для взаимодействия с другими приложениями.
  • Для описания разрешений, которые требуются другим приложениям для взаимодействия с компонентами данного приложения.
  • Для указания списка классов Instrumentation, предоставляющих профилирование и другую информацию о работе приложения. Используется только при разработке, при публикации удаляется из манифеста.
  • Для указания минимального уровня API, который требуется для приложения.
  • Для указания списка библиотек, которые должны быть подключены.

Структура манифеста

Диаграмма ниже показывает базовую структуру файла манифеста и все элементы, которые он включает. Каждый элемент со всеми его атрибутами описан в соответствующем разделе, который вы можете найти в меню слева.

[crayon-589755749424e048883466/]

Все доступные элементы приведены ниже. Вы не можете добавлять в манифест свои собственные элементы.

<action>
<activity>
<activity-alias>
<application>
<category>
<data>
<grant-uri-permission>
<instrumentation>
<intent-filter>
<manifest>
<meta-data>
<permission>
<permission-group>
<permission-tree>
<provider>
<service>
<supports-screens>
<uses-configuration>
<uses-feature>
<uses-library>
<uses-sdk>

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

Некоторые общие соглашения и правила для всех элементов и атрибутов манифеста:

Элементы

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

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

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

Атрибуты

Формально все атрибуты являются необязательными. Однако, некоторые из них должны быть указаны, чтобы элемент выполнял свое предназначение. Смотрите документацию, поистине необязательные атрибуты содержат значение по умолчанию, которое используется, если атрибут не указан.

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

Объявление имени класса

Многие элементы оперируют Java объектами, включая и сам элемент приложения (<application>) и соответствующие компоненты - явления (<activity>), сервисы (<service>), широковещательные приемники (<receiver>) и поставщики содержимого (<provider>).

Если вы создали подкласс, как вы почти всегда будете делать для всех компонентов, его имя указывается в атрибуте name. Имя должно включать также название пакета. Например:

[crayon-5897557494264434906866/]

Однако, для краткости, можно указать в качестве первого символа точку ".", тогда будет подставлено имя пакета, указанное в атрибуте package элемента <manifest>. Например:

[crayon-589755749426b350292655/]

При запуске компонента, система создает экземпляр указанного подкласса. Если подкласс не указан, будет создан экземпляр базового класса.

Множественные значения

Если может быть задано несколько значений, элемент обычно повторяется, а не указывается несколько значений в одном элементе. Например, фильтр намерений может содержать несколько значений:

[crayon-5897557494271920585615/]
Значения ресурсов

Некоторые атрибуты содержат значения, которые отображаются пользователям - например, иконка или заголовок явления. Такие значения должны быть локализованы и всегда храниться в ресурсах. Значение ресурсов указывается в следующем формате:

@[package:]type:name

где имя пакета package может быть опущено, если ресурс находится в пакете того же приложения, type - это тип ресурса (например string или drawable), а name - имя ресурса. Например:

[crayon-5897557494277320499016/]

Значения из темы выражаются таким же образом, но используется значок вопроса '?' вместо '@':

?[package:]type:name

Строковые значения

В качестве экранирующих символов строковых значений используется двойной бэкслэш "\\". Например, "\\n" для новой строки или "\\uxxxx" для символа таблицы Unicode.

Функции манифеста

В этом разделе мы рассмотрим как некоторые особенности Android отражены в файле манифеста.

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

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

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

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

Подробная информация содержится в разделе Намерения и фильтры намерений.

Заголовок и иконка

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

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

Иконка и заголовок установленная для фильтра намерения, используется также для компонента, если он выполняет функцию, указанную в фильтре. Например, фильтр со значением android.intent.action.MAIN и android.intent.categoryLAUNCHER указывает, что приложение должно быть отображено в списке приложений. Следовательно, иконка и заголовок данного фильтра будут отображаться в списке приложений.

Разрешения

Разрешение - это ограничение доступа к части кода или данным на устройстве. Ограничение накладывается для защиты критически важных данных или кода, который может быть поврежден.

Каждое разрешение имеет уникальный идентификатор. Часто идентификатор сам по себе указывает на действие, которое ограничивает разрешение. Например:

android.permission.CALL_EMERGENCY_NUMBERS
android.permission.READ_OWNER_DATA
android.permission.SET_WALLPAPER
android.permission.DEVICE_POWER

Функция может быть защищена не более чем одним разрешением.

Если приложению нужен доступ к защищенной функции, оно должно указать это требование с помощью элемента <uses-permission>. При установке приложения на устройство, установщик определяет выдается ли разрешение, проверяя сертификаты приложения и в некоторых случаях спрашивая пользователя. Если разрешение выдано, приложение сможет использовать защищенные функции. Если нет, попытки приложения использовать защищенные функции будут просто отклонены без уведомления пользователя.

Приложение может также защищать свои собственные компоненты (явления, сервисы и.т.д) с помощью разрешений. Для этого могут использовать либо свои собственные разрешения, либо объявленные системой Android, либо объявленные другими приложениями. Новое разрешение объявляется с помощью элемента <permission>. Например:

[crayon-5897557494283399792357/]

Отметим, что в данном примере разрешение DEBIT_ACСT не только объявлено с помощью элемента <permission>, но и задается его требование с помощью элемента <uses-permission>. Использование разрешения требуется для того, чтобы другие компоненты приложения могли запустить защищенное явление, хотя защита накладывается для этого же приложения.

Если, в данном примере, атрибут permission был бы установлен для разрешения, объявленного в другом месте (например android.permission.CALL_EMERGENCY_NUMBERS), тогда бы не требовалось использовать элемент <permission>. Однако, все еще необходимо было бы использовать элементе <uses-permission>.

Элемент <permission-tree> объявляет пространство имен для группы разрешений, которые будут объявлены в коде. Элемент <permission-group> указывает заголовок набора разрешений. Это влияет только на группировку разрешений при отображении пользователю. Элемент <permission-group> не указывает какие разрешения относятся к группе, он просто дает ей имя. Разрешения помещаются в группу с помощью атрибута permissionGroup элемента <permission>.

Библиотеки

Каждое приложение подключает стандартную библиотеку Android, которая включает основные пакеты для создания приложения (базовые классы, вроде Activity, Service, View, Intent и.т.д.).

Однако, некоторые пакеты находятся в других библиотеках. Если ваше приложение использует один из таких пакетов, вы должны явно присоединить их к приложению. Для этого используется элемент <uses-library>. Названия библиотек вы можете найти в документации к пакетам.