В статье представлены некоторые возможности AndroidManifest.xml, на который мало кто обращает особое внимание.

AndroidManifest.xml — предоставляет подробную информацию о приложении. В каждом Android приложении вы должны увидите этот файл, так как он является обязательным для создания приложения на ОС Android.

Предназначение

В AndroidManifest.xml можно настроить следующие возможности:

  • Указать имя Java-пакета приложения, который служит уникальным идентификатором;
  • Описать компоненты приложения, службы;
  • Указать список необходимых разрешений для обращения к защищенным частям API и взаимодействия с другими приложениями;
  • Разрешить доступ к ресурсам, которые сторонние приложения обязаны иметь для взаимодействия с компонентами данного приложения;
  • Указать минимальный и максимальный уровень API Android, необходимый для работы приложения;

Структура AndroidManifest.xml

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

Вот все основные возможности AndroidManifest.xml они представлены в виде xml тегов.

<?xml version="1.0" encoding="utf-8"?>

<manifest>

<uses-permission />
<permission />
<permission-tree />
<permission-group />
<instrumentation />
<uses-sdk />
<uses-configuration />
<uses-feature />
<supports-screens />
<compatible-screens />
<supports-gl-texture />

<application>

<activity>
<intent-filter>
<action />
<category />
<data />
</intent-filter>
<meta-data />
</activity>

<activity-alias>
<intent-filter> . . . </intent-filter>
<meta-data />
</activity-alias>

<service>
<intent-filter> . . . </intent-filter>
<meta-data/>
</service>

<receiver>
<intent-filter> . . . </intent-filter>
<meta-data />
</receiver>

<provider>
<grant-uri-permission />
<meta-data />
<path-permission />
</provider>

<uses-library />

</application>

</manifest>

Примерно так выглядит манифест файл, где каждый из тегов может хранить какуе-то конфигурацию.

А теперь по очереди, что и для чего.

Тег <manifest>

Это самый главный тег в котором вложена вся конфигурация проекта.

По умолчанию он создается вместе с файлом AndroidManifest и изначально имеет начальный набор параметров:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.helloworld"
android:versionCode="1"
android:versionName="1.0" >

Что же значат эти параметры?

xmins:android — определяет пространство имен Android;

package — определяет уникальное имя пакета приложения, которое вы задали при создании проекта.

Зачем указывать package? Если вы захотите загрузить ваше приложение на Google Play, то он проверяет уникальность при приеме приложения, поэтому рекомендуется использовать свое имя для избежания конфликтов с другими разработчиками.

android:versionCode — по сути это версия вашего приложения. Выпуская новую версию вы указываете её в этом поле, оно должно быть целым числом.

Выше мы говори про уникальность пакета, так вот если вы ранее загрузили на Google Play ваше приложение, то когда вы решите загрузить обновленную версию приложения, то вам нужно придерживаться нескольких правил. Имя пакета должно совпадать с тем, что уже загружено Google Play и указать версию android:versionCode на порядок выше. Но это при условии что вы выпускаете новую версию приложения, в случае если вы хотите добавить немного исправленную версию, то это читайте ниже.

Изменив данный параметр и загрузив приложение на Google Play все пользователям вашего приложения будет предложено обновится до новой версии приложения.

android:versionName — указывает номер пользовательской версии. Если вы нашли несколько недоработок в вашем приложении и исправили их, то в этом случае можно указать для этого поля новую версию, что будет говорить Google Play, что это не новая версия приложения, а улучшенная. Для именования версии можно использовать строку или строковый ресурс.

Изменив данный параметр и загрузив приложение на Google Play все пользователям вашего приложения будет предложено обновится до модифицированной версии приложения.

Тег <uses-permission>

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

Разрешения предоставляются во время установки приложения, а не во время его работы. <uses-permission> имеет единственный атрибут с именем разрешения android:name.

android:name — позволяет дать разрешения на использование ресурсов системы. Например:

android:name=’android.permission.CAMERA’
или
android:name=’android.permission.READ_CONTACTS’

Наиболее распространенные разрешения

INTERNET — доступ к интернету;

READ_CONTACTS — чтение данных из адресной книги пользователя;

WRITE_CONTACTS — запись данных из адресной книги пользователя;

RECEIVE_SMS — обработка входящих SMS;

ACCESS_COARSE_LOCATION — использование приблизительного определения местонахождения при помощи вышек сотовой связи или точек доступа Wi-Fi;

ACCESS_FINE_LOCATION — точное определение местонахождения при помощи GPS.

 Тег <permission>

<permission> — позволяет установить разрешения на использования ресурсов системы или запретить использование компонентов приложения.

android:name — название разрешения

android:label — имя разрешения, отображаемое пользователю

android:description — описание разрешения

android:icon — значок разрешения

android:permissionGroup — определяет принадлежность к группе разрешений

android:protectionLevel — уровень защиты

Тег <permission-tree>

<permission-tree> — объявляет базовое имя для дерева разрешений.

Этот элемент объявляет не само разрешение, а только пространство имен, в которое могут быть помещены дальнейшие разрешения.

Тег <permission-group>

<permission-group> — определяет имя для набора логически связанных разрешений.

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

Разрешение можно поместить в группу, назначив имя группы в атрибуте permissionGroup элемента <permission>.

Тег <instrumentation>

<instrumentation> — объявляет объект instrumentation, который дает возможность контролировать взаимодействие приложения с системой.

Обычно используется при отладке и тестировании приложения и удаляется из release-версии приложения.

Тег <uses-sdk>

<uses-sdk> — позволяет объявлять совместимость приложения с указанной версией (или более новыми версиями API) платформы Android.

Уровень API, объявленный приложением, сравнивается с уровнем API системы мобильного устройства, на который инсталлируется данное приложение.

Данный тег имеет следующие атрибуты:

android:minSdkVersion — определяет минимальный уровень API, требуемый для работы приложения.

Система Android будет препятствовать тому, чтобы пользователь установил приложение, если уровень API системы будет ниже, чем значение, определенное в этом атрибуте. Вы должны всегда объявлять этот атрибут, например:

android:minSdkVersion="17"

android:maxSDKVersion — позволяет определить самую позднюю версию, которую готова поддерживать ваше приложение.

Ваше приложение будет невидимым в Google Play для устройств с более свежей версией.

targetSDKVersion — позволяет указать платформу, для которой вы разрабатывали и тестировали приложение.

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

Тег <uses-configuration>

<uses-configuration> — указывает требуемую для приложения аппаратную и программную конфигурацию мобильного устройства.

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

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

reqHardKeyboard — используйте значение true, если приложению нужна аппаратная клавиатура;

reqKeyboardType — позволяет задать тип клавиатуры: nokeys, qwerty, twelvekey, undefined;

reqNavigation — укажите одно из значений: nonav, dpad, trackball, wheel или undefined, если требуется устройство для навигации;

Приложение не будет устанавливаться на устройстве, которое не соответствует заданной вами конфигурации.

В идеале, вы должны разработать такое приложение, которое будет работать с любым сочетанием устройств ввода. В этом случае <uses-configuration> не нужен.

Тег <uses-feature>

<uses-feature> объявляет определенную функциональность, требующуюся для работы приложения.

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

android.hardware.camera.front — требуется аппаратная камера

android.hardware.camera.autofocus — требуется камера с автоматической фокусировкой

В офф. документации Android можно посмотреть все параметры, вот ссылка.

Можно переопределить требование по умолчанию, добавив атрибут required со значением false.

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

<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />

Тег <supports-screens>

<supports-screens> — определяет разрешение экрана, требуемое для функционирования устройства.

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

Для других случаев система будет растягивать макет по мере возможности.

Значения:

smallScreen — QVGA экраны

normalScreen — стандартные экраны HVGA и WQVGA

largeScreen — большие экраны

xlargeScreen — очень большие экраны, которые превосходят размеры планшетов

anyDensity — установите значение true, если ваше приложение способно масштабироваться для отображения на экране с любым разрешением.

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

Начиная с API 13 — Android 3, у тега появились новые атрибуты:

requiresSmallestWidthDp — указываем минимальную поддерживаемую ширину экрана в аппаратно-независимых пикселях. С его помощью можно отфильтровать устройства при размещении приложения в Google Play

compatibleWidthLimitDp — задаёт верхнюю границу масштабирования для вашего приложения. Если экран устройства выходит за указанную границу, система включит режим совместимости.

largestWidthLimitDp — задаёт абсолютную верхнюю границу, за пределами которой ваше приложение точно не может быть смаштабировано. В этом случае приложение запускается в режиме совместимости, которую нельзя отключить.

Пример использования:

<supports-screens android:smallScreens="false"
android:normalScreens="true"
android:largeScreens"="true"
android:requiresSmallestWidthDp="480"
android:compatibleWidthLimitDp="600"
android:largestWidthLimitDp="720" />

Следует избегать подобных ситуаций и разрабатывать макеты для любых экранов.

Тег <compatible-screens>

<compatible-screens> — указывает для каждого экрана конфигурацию, с которой оно совместимо. Только один экземпляр <compatible-screens> элемента допускается в манифесте, но он может содержать несколько элементов <screen>. Каждый элемент <screen> указывает конкретный размер экрана с которой приложение совместимо. Этот элемент является информационным и может быть использован внешние услуги (например, Google Play), чтобы лучше понять совместимость приложения с конкретными конфигурациями экрана и включить фильтрацию для пользователей.

Данный тег имеет два атрибута:

android:screenSize — указывает размер экрана.

Значения:

small — маленький;

normal — средний;

large — большой;

xlarge — очень большой;

android:screen — указываем dpi

Значения:

ldpi — ~120dpi

mdpi — ~160dpi

hdpi — ~240dpi

xhdpi — ~320dpi

Пример использования:

<compatible-screens>
<screen android:screenSize="small" android:screenDensity="ldpi" />
<screen android:screenSize="small" android:screenDensity="mdpi" />
<screen android:screenSize="small" android:screenDensity="hdpi" />
<screen android:screenSize="small" android:screenDensity="xhdpi" />

<screen android:screenSize="normal" android:screenDensity="ldpi" />
<screen android:screenSize="normal" android:screenDensity="mdpi" />
<screen android:screenSize="normal" android:screenDensity="hdpi" />
<screen android:screenSize="normal" android:screenDensity="xhdpi" />
</compatible-screens>


Тег <supports-gl-texture>

<supports-gl-texture> — указывает одну текстуру GL сжатия, который поддерживается приложением.

Пример использования:

<supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" />
<supports-gl-texture android:name="GL_OES_compressed_paletted_texture" />

Значения:

GL_OES_compressed_ETC1_RGB8_texture — указано в OpenGL ES 2.0 и доступна во всех Android-устройствах, которые поддерживают OpenGL ES 2.0.

GL_OES_compressed_paletted_texture — общая палитра сжатия текстур.

GL_AMD_compressed_3DC_texture — ATI 3DС сжатия текстур.

Все значения можно посмотреть по этой ссылке.

Тег <application>

<application> — один из основных элементов манифеста, содержащий описание компонентов приложения, доступных в пакете: стили, иконки и др. Содержит дочерние элементы, которые объявляют каждый из компонентов, входящих в состав приложения. В манифесте может быть только один элемент <application>.

Ниже описание тегов которые вложены в тег <application>.

Тег <activity>

<activity> — указывает активность.

Если приложение содержит несколько активностей, они должны быть объявлены в манифесте, создавая для каждой из них свой элемент <activity>. Если активность не объявлена в манифесте, она не будет видна системе и не будет запущена при выполнении приложения или будет выводиться сообщение об ошибке.

Пример использования:

<activity android:name="com.devcolibri.HelloWorld.MainActivity" android:label="@string/app_name">

android:name — имя класса.

Имя должно включать полное обозначение пакета, но если имя пакета уже включенно в <manifest>, имя класса, реализующего деятельность, можно записывать в сокращенном виде, опуская имя пакета.

android:label — текстовая метка, отображаемая пользователю.

Тег <intent-filter>

Каждый тег <activity> поддерживает вложенные узлы <intent-filter>. Элемент <intent-filter> определяет типы намерений, на которые могут ответить деятельность, сервис или приемник намерений. Фильтр намерений предоставляет для компонентов-клиентов возможность получения намерений объявляемого типа, отфильтровывая те, которые не значимы для компонента, и содержит дочерние элементы <action>, <category>, <data>.

Тег <action>

Элемент <action> добавляет действие к фильтру намерений. Элемент <intent-filter> должен содержать один или более элементов <action>. Если в элементе <intent-fiiter> не будет этих элементов, то объекты намерений не пройдут через фильтр. Пример объявления действия:

<action android:name="android.intent.action.MAIN">

Тег <category>

<category> — определяет категорию компонента, которую должно обработать намерение. Это строковые константы, определенные в классе intent, например:

<category android:name="android.intent.category.LAUNCHER">

Тег <data>

<data> — добавляет спецификацию данных к фильтру намерений.

Спецификация может быть только типом данных (атрибут mimeType), URI или типом данных вместе с URI.

Значение URI определяется отдельными атрибутами для каждой из его частей, т. е. URI делится на части:

android:scheme;

android:host;

android:port;

android:path или android:pathPrefix;

android:pathPattern.

Тег <meta-data>

<meta-data> — определяет пару «имя-значение» для элемента дополнительных произвольных данных, которыми можно снабдить родительский компонент.

Составляющий элемент может содержать любое число элементов <meta-data>.

Тег <activity-alias>

<activity-alias> — это псевдоним для Activity, определенной в атрибуте targetActivity.

Целевая деятельность должна быть в том же самом приложении, что и псевдоним, и должна быть объявлена перед псевдонимом деятельности в манифесте. Псевдоним представляет целевую деятельность как независимый объект. У псевдонима может быть свой собственный набор фильтров намерений, определяющий, какие намерения могут активизировать целевую деятельность и как система будет обрабатывать эту деятельность.

Например, фильтры намерений на псевдониме деятельности могут определить флаги:

android:name=’android.intent.action.MAIN’

и

android:name=’android.intent.category.LAUNCHER’

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

Тег <service>

<service> — объявляет службу как один из компонентов приложения. Службы, которые не были объявлены, не будут обнаружены системой и никогда не будут запущены.

Тег <receiver>

<receiver> — объявляет приемник широковещательных намерений как один из компонентов приложения.

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

Тег <provider>

Элемент <provider> объявляет контент-провайдера (источник данных) для управления доступом к базам данных. Элемент <provider> содержит свой набор дочерних элементов для установления разрешений доступа к данным:

<grant-uri-permission>

<path-permission>

<meta-data>

Тег <grant-uri-permission>

Элемент <grant-uri-permission> является дочерним элементом для <provider>. Он определяет, для кого можно предоставить разрешения на подмножества данных контент-провайдера. Предоставление разрешения является способом допустить к подмножеству данных, предоставляемым контент-провайдером, клиента, у которого нет разрешения для доступа к полным данным. Если атрибут granturiPermissions контент-провайдера имеет значение true, то разрешение предоставляется для любых данных, поставляемых контент-провайдером. Однако, если атрибут поставлен в false, разрешение можно предоставить только подмножествам данных, которые определены этим элементом. Контент-провайдер может содержать любое число элементов <grant-uri-permission>.

Тег <path-permission>

<path-permission> — дочерний элемент для <provider>. Определяет путь и требуемые разрешения для определенного подмножества данных в пределах поставщика оперативной информации. Этот элемент может быть определен многократно, чтобы поставлять множественные пути.

Тег <uses-library>

<uses-library> — определяет общедоступную библиотеку, с которой должно быть скомпоновано приложение. Этот элемент указывает системе на необходимость включения кода библиотеки в загрузчик классов для пакета приложения. Каждый проект связан по умолчанию с библиотеками Android, в которые включены основные пакеты для сборки приложений. Однако некоторые пакеты находятся в отдельных библиотеках, которые автоматически не компонуются с приложением. Если же приложение использует пакеты из этих библиотек или других, от сторонних разработчиков, необходимо сделать явное связывание с этими библиотеками и манифест обязательно должен содержать отдельный элемент <uses-library>.