Работа с манифестом Android
AndroidManifest.xml — это мощный файл на платформе Android, который позволяет описать функциональные возможности и требования вашего приложения к Android. Однако работать с ним непросто. Xamarin.Android помогает свести к минимуму эту сложность, позволяя добавлять настраиваемые атрибуты в классы, которые затем будут использоваться для автоматического создания манифеста. Наша цель заключается в том, чтобы 99 % пользователей никогда не нуждались в ручном изменении AndroidManifest.xml.
AndroidManifest.xml создается в процессе сборки, а XML-код, найденный в properties/AndroidManifest.xml , объединяется с XML- кодом, созданным из пользовательских атрибутов. Результирующий объединенный AndroidManifest.xml находится в подкаталоге obj ; Например, он находится в obj/Debug/android/AndroidManifest.xml для отладочных сборок. Процесс слияния прост: он использует настраиваемые атрибуты в коде для создания XML-элементов и вставляет эти элементы в AndroidManifest.xml.
Основы
Во время компиляции сборки проверяются на наличие классов, не abstract являющихся производными от Activity , и в [Activity] них объявлен атрибут . Затем он использует эти классы и атрибуты для построения манифеста. Рассмотрим следующий пример кода:
namespace Demo < public class MyActivity : Activity < >>
В результате в AndroidManifest.xmlничего не создается. Если требуется создать элемент , необходимо использовать [Activity] настраиваемый атрибут:
namespace Demo < [Activity] public class MyActivity : Activity < >>
В этом примере следующий фрагмент XML добавляется в AndroidManifest.xml:
Атрибут [Activity] не влияет на abstract типы; abstract типы игнорируются.
Activity Name
Начиная с версии Xamarin.Android 5.1 имя типа действия основано на MD5SUM имени экспортируемого типа. Это позволяет предоставить одно и то же полное имя из двух разных сборок и не получить ошибку упаковки. (До версии Xamarin.Android 5.1 имя типа действия по умолчанию было создано из пространства имен в нижнем регистре и имени класса.)
Если вы хотите переопределить это значение по умолчанию и явно указать имя действия, используйте Name свойство :
[Activity (Name="awesome.demo.activity")] public class MyActivity : Activity
В этом примере создается следующий фрагмент XML:
Свойство следует использовать Name только в целях обратной совместимости, так как такое переименование может замедлить поиск типов во время выполнения. Если у вас есть устаревший код, который ожидает, что имя типа действия по умолчанию будет основываться на пространстве имен в нижнем регистре и имени класса, см. раздел Именование вызываемой оболочки Android , чтобы получить советы по поддержанию совместимости.
Строка заголовка действия
По умолчанию Android предоставляет приложению строку заголовка при его запуске. Для этого используется /manifest/application/activity/@android:label значение . В большинстве случаев это значение будет отличаться от имени класса. Чтобы указать метку приложения в строке заголовка Label , используйте свойство . Пример:
[Activity (Label="Awesome Demo App")] public class MyActivity : Activity
В этом примере создается следующий фрагмент XML:
Можно запустить из программы выбора приложений
По умолчанию ваше действие не отображается на экране средства запуска приложений Android. Это связано с тем, что в приложении, скорее всего, будет много действий, и вам не нужен значок для каждого из них. Чтобы указать, какой из них следует запускать из средства запуска приложений MainLauncher , используйте свойство . Пример:
[Activity (Label="Awesome Demo App", MainLauncher=true)] public class MyActivity : Activity
В этом примере создается следующий фрагмент XML:
Значок действия
По умолчанию для вашего действия будет предоставлен значок средства запуска по умолчанию, предоставленный системой. Чтобы использовать пользовательский значок, сначала добавьте .png в раздел Resources/drawable, задайте для параметра Действие сборки значение AndroidResource, а затем используйте Icon свойство , чтобы указать используемый значок. Пример:
[Activity (Label="Awesome Demo App", MainLauncher=true, Icon="@drawable/myicon")] public class MyActivity : Activity
В этом примере создается следующий фрагмент XML:
Разрешения
При добавлении разрешений в манифест Android (как описано в разделе Добавление разрешений в манифест Android) эти разрешения записываются в раздел Свойства/AndroidManifest.xml. Например, если задать INTERNET разрешение, в Properties/AndroidManifest.xmlдобавляется следующий элемент :
Отладочные сборки автоматически задают некоторые разрешения, чтобы упростить отладку (например, INTERNET и READ_EXTERNAL_STORAGE ). Эти параметры задаются только в созданном obj/Debug/android/AndroidManifest.xml и не отображаются как включенные в параметрах Необходимые разрешения .
Например, если вы изучите созданный файл манифеста в obj/Debug/android/AndroidManifest.xml, вы можете увидеть следующие добавленные элементы разрешений:
В выпуске версии сборки манифеста ( obj/Debug/android/AndroidManifest.xml) эти разрешения не настраиваются автоматически. Если вы обнаружите, что при переключении на сборку выпуска приложение теряет разрешение, доступное в отладочной сборке, убедитесь, что вы явно задали это разрешение в параметрах Необходимые разрешения для приложения (см. раздел Сборка > приложения Android в Visual Studio для Mac; см. раздел Свойства > манифеста Android в Visual Studio).
Дополнительные функции
Действия и функции намерений
Манифест Android предоставляет вам способ описания возможностей вашей деятельности. Это можно сделать с помощью намерений и [IntentFilter] настраиваемый атрибут. Вы можете указать, какие действия подходят для вашего действия, с помощью IntentFilter конструктор и категории, подходящие дляСвойство Categories . Необходимо указать хотя бы одно действие (поэтому действия предоставляются в конструкторе). [IntentFilter] может быть предоставлено несколько раз, и каждое использование приводит к отдельному элементу в . Пример:
[Activity (Label="Awesome Demo App", MainLauncher=true, Icon="@drawable/myicon")] [IntentFilter (new[], Categories=new[])] public class MyActivity : Activity
В этом примере создается следующий фрагмент XML:
Элемент Application
Манифест Android также предоставляет способ объявления свойств для всего приложения. Это делается с помощью элемента и его аналога, настраиваемого атрибута Application . Обратите внимание, что это параметры на уровне приложения (на уровне сборки), а не параметры для каждого действия. Как правило, вы объявляете свойства для всего приложения, а затем переопределяете эти параметры (при необходимости) для каждого действия.
Например, следующий Application атрибут добавляется в AssemblyInfo.cs , чтобы указать, что приложение можно отлаживать, что его понятное имя — My App и что оно использует Theme.Light стиль в качестве темы по умолчанию для всех действий:
[assembly: Application (Debuggable=true, Label="My App", Theme="@android:style/Theme.Light")]
Это объявление приводит к созданию следующего фрагмента XML в obj/Debug/android/AndroidManifest.xml:
В этом примере для всех действий в приложении по умолчанию используется Theme.Light стиль . Если для темы Theme.Dialog действия задано значение , стиль будет использоваться Theme.Dialog только в этом действии, а для всех остальных действий в приложении по умолчанию используется Theme.Light стиль, заданный в элементе .
Элемент Application — не единственный способ настройки атрибутов. Кроме того, можно вставить атрибуты непосредственно в элемент Properties/AndroidManifest.xml. Эти параметры объединяются с последним элементом, который находится в obj/Debug/android/AndroidManifest.xml. Обратите внимание, что содержимое properties/AndroidManifest.xml всегда переопределяет данные, предоставляемые настраиваемыми атрибутами.
Существует множество атрибутов для всего приложения, которые можно настроить в элементе . Дополнительные сведения об этих параметрах см. в разделе Общедоступные свойствастатьи ApplicationAttribute.
Список настраиваемых атрибутов
- Android.App.ActivityAttribute : создает XML-фрагмент /manifest/application/activity .
- Android.App.ApplicationAttribute : создает XML-фрагмент /manifest/application .
- Android.App.InstrumentationAttribute: создает XML-фрагмент /manifest/instrumentation
- Android.App.IntentFilterAttribute: создает XML-фрагмент //intent-filter
- Android.App.MetaDataAttribute: создает XML-фрагмент //meta-data
- Android.App.PermissionAttribute : создает XML-фрагмент //permission .
- Android.App.PermissionGroupAttribute: создает XML-фрагмент //permission-group
- Android.App.PermissionTreeAttribute: создает XML-фрагмент //permission-tree
- Android.App.ServiceAttribute : создает XML-фрагмент /manifest/application/service .
- Android.App.UsesLibraryAttribute : создает XML-фрагмент /manifest/application/uses-library .
- Android.App.UsesPermissionAttribute: создает XML-фрагмент /manifest/uses-permission.
- Android.Content.BroadcastReceiverAttribute: создает XML-фрагмент /manifest/application/receiver
- Android.Content.ContentProviderAttribute : создает XML-фрагмент /manifest/application/provider .
- Android.Content.GrantUriPermissionAttribute : создает XML-фрагмент /manifest/application/provider/grant-uri-permission .
Файл манифеста AndroidManifest.xml
Файл манифеста AndroidManifest.xml предоставляет основную информацию о программе системе. Каждое приложение должно иметь свой файл AndroidManifest.xml. Редактировать файл манифеста можно вручную, изменяя XML-код или через визуальный редактор Manifest Editor (Редактор файла манифеста), который позволяет осуществлять визуальное и текстовое редактирование файла манифеста приложения.
Назначение файла
- объявляет имя Java-пакета приложения, который служит уникальным идентификатором;
- описывает компоненты приложения — деятельности, службы, приемники широковещательных намерений и контент-провайдеры, что позволяет вызывать классы, которые реализуют каждый из компонентов, и объявляет их намерения;
- содержит список необходимых разрешений для обращения к защищенным частям API и взаимодействия с другими приложениями;
- объявляет разрешения, которые сторонние приложения обязаны иметь для взаимодействия с компонентами данного приложения;
- объявляет минимальный уровень API Android, необходимый для работы приложения;
- перечисляет связанные библиотеки;
Общая структура манифеста
Файл манифеста инкапсулирует всю архитектуру Android-приложения, его функциональные возможности и конфигурацию. В процессе разработки приложения вам придётся постоянно редактировать данный файл, изменяя его структуру и дополняя новыми элементами и атрибутами.
Корневым элементом манифеста является . Помимо данного элемента обязательными элементами является теги и . Элемент является основным элементом манифеста и содержит множество дочерних элементов, определяющих структуру и работу приложения. Порядок расположения элементов, находящихся на одном уровне, произвольный. Все значения устанавливаются через атрибуты элементов. Кроме обязательных элементов, упомянутых выше, в манифесте по мере необходимости используются другие элементы.
Описание
Элемент является корневым элементом манифеста.
Атрибуты
xmlns:android определяет пространство имён Android. Оно всегда одно и то же package определяет уникальное имя пакета приложения, которое вы задали при создании проекта. Android Marketplace проверяет уникальность при приеме приложения, поэтому рекомендуется использовать свое имя для избежания конфликтов с другими разработчиками. Например, я использую имя своего сайта в обратном порядке: ru.alexanderklimov.appname. Сейчас в студии данный атрибут перекочевал в build.gradle в виде namespace в секции android. Из манифеста атрибут убрали. android:versionCode указывает на внутренний номер версии, используемый для сравнения версий программы. «versionCode» должен быть целым, и Android Market использует это для определения, предоставили ли вы новую версию, передавая триггеру обновления на устройствах, на которых установлено ваше приложение. Как правило. начинается с 1 и увеличивается на единицу, если вы выпускаете новую версию приложения. Сейчас в студии данный атрибут перекочевал в build.gradle android:versionName указывает номер пользовательской версии. Можно использовать строку или строковый ресурс. Этот номер видит пользователь. Сейчас в студии данный атрибут перекочевал в build.gradle
Читайте совет Получить номер версии программы
Элемент объявляет разрешение, которое используется для ограничения доступа к определенным компонентам или функциональности данного приложения. В этой секции описываются права, которые должны запросить другие приложения для получения доступа к вашему приложению. Приложение может также защитить свои собственные компоненты (деятельности, службы, приемники широковещательных намерений и контент-провайдеры) разрешениями. Оно может использовать любое из системных разрешений, определенных Android или объявленных другими приложениями, а также может определить свои собственные разрешения.
android:name название разрешения android:label имя разрешения, отображаемое пользователю android:description описание разрешения android:icon значок разрешения android:permissionGroup определяет принадлежность к группе разрешений android:protectionLevel уровень защиты
Элемент запрашивает разрешение, которые приложению должны быть предоставлены системой для его нормального функционирования. Разрешения предоставляются во время установки приложения, а не во время его работы.
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
Элемент объявляет базовое имя для дерева разрешений. Этот элемент объявляет не само разрешение, а только пространство имен, в которое могут быть помещены дальнейшие разрешения.
Элемент определяет имя для набора логически связанных разрешений. Это могут быть как объявленные в этом же манифесте с элементом разрешения, так и объявленные в другом месте. Этот элемент не объявляет разрешение непосредственно, только категорию, в которую могут быть помещены разрешения. Разрешение можно поместить в группу, назначив имя группы в атрибуте permissionGroup элемента .
Элемент объявляет объект instrumentation, который дает возможность контролировать взаимодействие приложения с системой. Обычно используется при отладке и тестировании приложения и удаляется из release-версии приложения.
Элемент позволяет объявлять совместимость приложения с указанной версией (или более новыми версиями API) платформы Android. Уровень API, объявленный приложением, сравнивается с уровнем API системы мобильного устройства, на который инсталлируется данное приложение.
Атрибуты
android:minSdkVersion определяет минимальный уровень API, требуемый для работы приложения. Система Android будет препятствовать тому, чтобы пользователь установил приложение, если уровень API системы будет ниже, чем значение, определенное в этом атрибуте. Вы должны всегда объявлять этот атрибут, например: android:minSdkVersion=»11″. Вы можете ради интереса установить значение 7, а потом 11 и сравнить внешний вид приложения. Например, у младшей версии не будет отображаться ActionBar. android:maxSDKVersion позволяет определить самую позднюю версию, которую готова поддерживать ваша программа. Ваше приложение будет невидимым в Google Play для устройств с более свежей версией. Рекомендуется устанавливать в том случае, когда вы точно уверены, что приложение не будет корректно работать на новой платформе. targetSDKVersion позволяет указать платформу, для которой вы разрабатывали и тестировали приложение. Устанавливая значение для этого атрибута, вы сообщаете системе, что для поддержки этой конкретной версии не требуется никаких изменений.
Элемент указывает требуемую для приложения аппаратную и программную конфигурацию мобильного устройства. Например, приложение могло бы определить требования обязательного наличия на устройстве физической клавиатуры или USB-nopTa. Спецификация используется, чтобы избежать установки приложения на устройствах, которые не поддерживают требуемую конфигурацию. Если приложение может работать с различными конфигурациями устройства, необходимо включить в манифест отдельные элементы для каждой конфигурации. Вы можете задать любую комбинацию, содержащие следующие устройства
- reqFiveWayNav — используйте значение true, если приложению требуется устройство ввода, поддерживающее навигацию вверх, вниз, влево, вправо, а также нажатие выделенного элемента. К таким устройствам относятся трекболы и D-pad. В принципе устарело
- reqHardKeyboard — используйте значение true, если приложению нужна аппаратная клавиатура.
- reqKeyboardType — позволяет задать тип клавиатуры: nokeys, qwerty, twelvekey, undefined
- reqNavigation — укажите одно из значений: nonav, dpad, trackball, wheel или undefined, если требуется устройство для навигации
- reqTouchScreen — если требуется сенсорный экран, то используйте нужное значение из возможных вариантов: notouch, stylus, finger, undefined. Сейчас практически все устройства содержат сенсорный экран, поэтому тоже устарело
Приложение не будет устанавливаться на устройстве, которое не соответствует заданной вами конфигурации. В идеале, вы должны разработать такое приложение, которое будет работать с любым сочетанием устройств ввода. В этом случае не нужен.
Элемент объявляет определенную функциональность, требующуюся для работы приложения. Таким образом, приложение не будет установлено на устройствах, которые не имеют требуемую функциональность. Например, приложение могло бы определить, что оно требует камеру с автофокусом. Если устройство не имеет встроенную камеру с автофокусом, приложения не будет инсталлировано.
android.hardware.camera требуется аппаратная камера android.hardware.camera.autofocus требуется камера с автоматической фокусировкой
Список можно увидеть здесь.
Можно переопределить требование по умолчанию, добавив атрибут required со значением false. Например, если вашей программе не требуется, чтобы камера поддерживала автофокус, то используйте вариант:
Элемент определяет разрешение экрана, требуемое для функционирования устройства. Данный тег позволяет указать размеры экран, для которого был спроектировано приложение. Система будет масштабировать ваше приложение на основе ваших макетов на тех устройствах, которые поддерживают указанные вами разрешения экран. Для других случаев система будет растягивать макет по мере возможности.
smallScreen как правило экраны QVGA normalScreen стандартные экраны HVGA и WQVGA largeScreen большие экраны xlargeScreen очень большие экраны, которые превосходят размеры планшетов anyDensity установите значение true, если ваше приложение способно масштабироваться для отображения на экране с любым разрешением.
По умолчанию, для каждого атрибута установлено значение true. Вы можете указать, какие размеры экранов ваше приложение не поддерживает.
Начиная с API 13 (Android 3), у тега появились новые атрибуты:
- requiresSmallestWidthDp — указываем минимальную поддерживаемую ширину экрана (наименьшая сторона устройства) в аппаратно-независимых пикселях. С его помощью можно отфильтровать устройства при размещении приложения в Google Play
- compatibleWidthLimitDp — задаёт верхнюю границу масштабирования для вашего приложения. Если экран устройства выходит за указанную границу, система включит режим совместимости.
- largestWidthLimitDp — задаёт абсолютную верхнюю границу, за пределами которой ваше приложение точно не может быть смаштабировано. В этом случае приложение запускается в режиме совместимости, которую нельзя отключить. Следует избегать подобных ситуаций и разрабатывать макеты для любых экранов.
Элемент один из основных элементов манифеста, содержащий описание компонентов приложения, доступных в пакете: стили, значок и др. Содержит дочерние элементы, которые объявляют каждый из компонентов, входящих в состав приложения. В манифесте может быть только один элемент .
Элемент объявляет активность. Если приложение содержит несколько активностей, не забывайте объявлять их в манифесте, создавая для каждой из них свой элемент . Если активность не объявлена в манифесте, она не будет видна системе и не будет запущена при выполнении приложения или будет выводиться сообщение об ошибке.
Для этого класса зарегистрирован фильтр вызовов, определяющий, что это действие запущено в приложении (действие android:name=«android.intent.action.MAIN»). Определение категории (категория android:name=«android.intent.category.LAUNCHER» ) определяет, что это приложение добавлено в директорию приложений на Android-устройстве. Значения @ направляют файлы ресурсов, которые содержат актуальные значения. Это упрощает работу с разными ресурсами, такими как строки, цвета, значки.
Атрибуты
android:name имя класса. Имя должно включать полное обозначение пакета, но т. к. имя пакета уже определено в корневом элементе
android:exported Позволяет или запрещает запускать активность другим приложениям. Если атрибута нет, то по умолчанию равно false и другие приложения не могут запускать вашу активность. Но если у активности есть интент-фильтры, то по умолчанию это значение будет уже равно true. Это может запутать новичков. Поэтому, если вы хотите запретить запуск через сторонние приложения, то явно указывайте нужное значение.
Элемент содержит множество других атрибутов, определяющих разрешения, ориентацию экрана и т. д.
Изменение конфигурации во время выполнения программы
При изменении языка, региона или аппаратной конфигурации Android прерывает работу всех приложений и затем запускает их повторно, перезагружая значения из ресурсов. Подобное поведение не всегда уместно и желательно. Например, некоторые изменения конфигурации (ориентация экрана в пространстве, доступность клавиатуры) могут произойти только лишь из-за того, что пользователь повернул устройство или выдвинул клавиатуру. Вы можете настраивать, каким образом ваше приложение будет реагировать на подобные изменения, обнаруживая их и выполняя собственные действия. Чтобы заставить Активность отслеживать изменения конфигурации при выполнении программы, добавьте в ее узел в манифесте атрибут android:configChanges, указав, какие именно события хотите обрабатывать.
Перечислим некоторые значения, с помощью которых можно описать изменения конфигурации:
- оrientation — положение экрана изменено с портретного на альбомное (или наоборот);
- keyboardHidden — клавиатура (или D-pad и другое устройство) выдвинута или спрятана;
- fontScale — пользователь изменил предпочтительный размер шрифта;
- locale — пользователь выбрал новые языковые настройки;
- keyboard — изменился тип клавиатуры; например, телефон может иметь 12-клавишную панель, при повороте которой появляется полноценная клавиатура. Или была подключена внешняя клавиатура.
- touchscreen или navigation — изменился тип клавиатуры или способ навигации. Как правило, такие события не встречаются.
- mcc или mnc — обнаружена новая SIM-карта, при этом изменились страна и код сотовой сети соответственно.
- uiMode — изменился режим пользовательского интерфейса, например, при переключении между автомобильным, дневным и ночным режимами.
- screenLayout — изменились характеристики экрана, например, при активации другого дисплея.
- screenSize — изменлись размеры экрана, например, при смене ориентации. Появилось в Android 3 (API 12)
- smallestScreenSize — изменился физический размер экрана, например, при подключении внешнего дисплея. Появилось в Android 3 (API 12)
В некоторых случаях одновременно будут срабатывать несколько событий. Например, когда пользователь выдвигает клавиатуру, большинство устройств генерируют события keyboardHidden и orientation. Вы можете выбирать несколько событий, которые хотите обрабатывать самостоятельно, разделяя их символом |.
Наличие атрибута android:configChanges отменяет перезапуск приложения при заданных изменениях конфигурации. Вместо этого внутри активности срабатывает метод onConfigurationChanged(). Переопределите его, чтобы появилась возможность обрабатывать изменения в конфигурации. Используйте переданный объект Configuration, чтобы получить новые значения. Не забудьте вызвать одноименный метод из родительского класса и перезагрузить измененные значения со всех ресурсов, которые используются внутри активности.
@Override public void onConfigurationChanged(Configuration _newConfig) < super.onConfigurationChanged(_newConfig); [ . Обновите пользовательский интерфейс, используя данные из ресурсов . ] if (_newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) < [ . Реакция на измененную ориентацию экрана . ] >if (_newConfig.keyboardHidden == Configuration.KEYBOARDHIDDEN_NO) < [ . Реакция на выдвигание/задвигание клавиатуры . ] >>
На момент вызова метода, все данные из ресурсов будут обновлены, поэтому применять метод можно без опаски.
Любые изменения конфигурации, которые не были явно помечены для обработки внутри вашего приложения, приведут к перезапуску активности, минуя вызов метода onConfigurationChanged().
Каждый тег поддерживает вложенные узлы . Элемент определяет типы намерений, на которые могут ответить деятельность, сервис или приемник намерений. Фильтр намерений объявляет возможности его родительского компонента — что могут сделать деятельность или служба и какие типы рассылок получатель может обработать. Фильтр намерений предоставляет для компонентов-клиентов возможность получения намерений объявляемого типа, отфильтровывая те, которые не значимы для компонента, и содержит дочерние элементы , , .
Элемент добавляет действие к фильтру намерений. Элемент должен содержать один или более элементов . Если в элементе не будет этих элементов, то объекты намерений не пройдут через фильтр. Пример объявления действия:
Элемент определяет категорию компонента, которую должно обработать намерение. Это строковые константы, определенные в классе intent, например:
Элемент добавляет спецификацию данных к фильтру намерений. Спецификация может быть только типом данных (атрибут mimeType), URI или ТИПОМ данных вместе с URI. Значение URI определяется отдельными атрибутами для каждой из его частей, т. е. URI делитСЯ на части: android:scheme, android:host, android:port, android:path или android:pathPrefix, android:pathPattern.
Элемент определяет пару «имя-значение» для элемента дополнительных произвольных данных, которыми можно снабдить родительский компонент. Составляющий элемент может содержать любое число элементов .
Элемент — это псевдоним для Activity, определенной в атрибуте targetActivity. Целевая деятельность должна быть в том же самом приложении, что и псевдоним, и должна быть объявлена перед псевдонимом деятельности в манифесте. Псевдоним представляет целевую деятельность как независимый объект. У псевдонима может быть свой собственный набор фильтров намерений, определяющий, какие намерения могут активизировать целевую деятельность и как система будет обрабатывать эту деятельность. Например, фильтры намерений на псевдониме деятельности могут определить флаги android:name=»android.intent.action.MAIN» и android:name=»android.intent.category.LAUNCHER», заставляя целевую деятельность загружаться при запуске приложения даже в том случае, когда в фильтрах намерений на целевой деятельности эти флаги не установлены.
Элемент объявляет службу как один из компонентов приложения. Все службы должны быть представлены элементом в файле манифеста. Службы, которые не были объявлены, не будут обнаружены системой и никогда не будут запущены. Этот элемент имеет много атрибутов, определяющих имя, доступность, разрешения, процесс и т. д. Поддерживает вложенные узлы
В Android 11 появилась новая запись для работы службы в режиме Foreground (активное состояние).
Элемент объявляет приёмник широковещательных намерений как один из компонентов приложения. Приёмники широковещательных намерений дают возможность приложениям получить намерения, которые переданы системой или другими приложениями, даже когда другие компоненты приложения не работают.
Элемент объявляет контент-провайдера (источник данных) для управления доступом к базам данных. Все контент-провайдеры, которые являются частью приложения, должны быть представлены в элементах в файле манифеста. Если они не объявлены, они не будут работать, т.к. система их не сможет увидеть. Элемент содержит свой набор дочерних элементов для установления разрешений доступа к данным:
Этот элемент имеет много атрибутов, определяющих имя, доступность, разрешения, процесс и т. д.
Элемент является дочерним элементом для . Он определяет, для кого можно предоставить разрешения на подмножества данных контент-провайдера. Предоставление разрешения является способом допустить к подмножеству данных, предоставляемым контент-провайдером, клиента, у которого нет разрешения для доступа к полным данным. Если атрибут granturiPermissions контент-провайдера имеет значение true, то разрешение предоставляется для любых данных, поставляемых контент-провайдером. Однако, если атрибут поставлен в false, разрешение можно предоставить только подмножествам данных, которые определены этим элементом. Контент-провайдер может содержать любое число элементов .
Элемент — дочерний элемент для . Определяет путь и требуемые разрешения для определённого подмножества данных в пределах поставщика оперативной информации. Этот элемент может быть определён многократно, чтобы поставлять множественные пути.
Элемент определяет общедоступную библиотеку, с которой должно быть скомпоновано приложение. Этот элемент указывает системе на необходимость включения кода библиотеки в загрузчик классов для пакета приложения. Каждый проект связан по умолчанию с библиотеками Android, в которые включены основные пакеты для сборки приложений (с классами общего назначения типа Activity, Service, Intent, View, Button, Application, ContentProvider и т. д.). Однако некоторые пакеты находятся в отдельных библиотеках, которые автоматически не компонуются с приложением. Если же приложение использует пакеты из этих библиотек или других, от сторонних разработчиков, необходимо сделать явное связывание с этими библиотеками и манифест обязательно должен содержать отдельный элемент .
Формат AndroidManifest.xml #
Какой формат у файла AndroidManifest.xml, который находится в .apk-архивах для Android’а?
Ответ:
Своеобразный бинарный XML:
Мне удалось более-менее распотрошить этот формат. За основу своих исследований я взял утилиту axml2xml.pl написанную на Перле, автор которой несколько запутался в структуре файла и подошёл к разбору чисто эмпирически. Также я попробовал библиотеку для WbXML-файлов libwbxml версии 0.10.8, трудно сказать почему (опустим мои мучения связанные с её компиляцией под Win32), но она не хочет читать этот формат.
На самом деле файл состоит из набора кусочков (chunks), каждый из которых имеет небольшой обязательный заголовок из 8 байт — два слова по 16-бит и одно 32-бит. Первое слово — тип кусочка, второе — размер заголовка кусочка, он может включать дополнительные данные заголовка, соответственно минимальный размер 8 байт. Третье слово — общий размер кусочка включая данные после заголовка кусочка, минимальный размер тоже 8 байт. В начале файла AndroidManifest.xml стоит кусочек с типом 0x0003, длинной заголовка кусочка в 8 байт и общим размером во весь файл, все остальные кусочки расположены единым списком внутри него, и, похоже, что больше вложенных друг в друга кусочков нет. В других файлах, другие начальные типы, и могут быть вложенные кусочки (с принципом “вложения” до конца ещё не разобрался).
Схематично файл можно представить так:
[ Начало файла [ Таблица строк ] [ Неизвестный кусочек ] [ Начало области имени ] [ Начало тега ] . [ Конец тега ] [ Конец области имени ] ]
Обнаруженные и идентифицированные типы кусочков такие:
- 0x0003 — Начало файла (file begin);
- 0x0001 — Таблица строк (string table);
- 0x0100 — Начало области имени (namespace);
- 0x0101 — Конец области имени (namespace);
- 0x0102 — Начало XML-тега (tag);
- 0x0103 — Конец XML-тега (tag).
Не удалось определить только кусочек с типом “0x0180”.
У типа “Начало XML-тега” присутствует набор атрибутов различных типов данных, я их обозначил так:
- 0x01000008 — [reference] Ссылка на ресурс, по всей видимости описанный в файле resources.arsc;
- 0x03000008 — [string] Номер строки из таблицы строк;
- 0x10000008 — [select] Число используемое для выбора из списка предопределённых констант;
- 0x11000008 — [integer] Целое 32-битное число;
- 0x12000008 — [boolean] Булевское значение true (0xffffffff) или false (0x00000000).
Результатом моих изысканий стала консольная программа которая преобразует бинарный XML в нормальный текстовый XML, а также позволяет просматривать структуру файла. Программа работает как с отдельным файлом, так и с находящимся внутри apk-архива.
Кроме самого AndroidManifest.xml в архиве можно прочитать и другие файлы того же формата, например, resources.arsc или xml-файлы из подкаталога “res”. Исходные тексты программы прилагаются. Надеюсь скоро кто-нибудь полностью расшифрует этот формат.
Командная строка #
Чтобы обработать отдельный XML-файл программу надо запускать так:
AndroidXML.exe [опции] [исследуемый файл.xml]
Чтобы обработать файл внутри APK-упаковки, так:
AndroidXML.exe [опции] [файл упаковки.apk] [исследуемый файл внутри]
Если не указать “исследуемый файл”, то по-умолчанию будет взят AndroidManifest.xml. Вместо apk-файла можно указать zip-файл, собственно apk — это и есть zip-архив.
Опции командной строки #
- /debug — Вывод информации о структуре кусочков;
- /pause — Останов после работы программы, чтобы консольное окно не закрывалось;
- /relax — Игнорирование небольших “ошибок” в структуре параметров XML-тегов при разборе файла.
Загрузка #
Пример работы программы в режиме XML #
android:versionCode="234" android:versionName="2.3.4" package="com.gameloft.android.Gloft11US"> android:name="android.permission.VIBRATE"> android:label="7f040011" android:icon="7f020000"> android:label="7f040011" android:name="Gloft11US" android:screenOrientation="1" android:configChanges="240"> android:name="android.intent.action.MAIN"> android:name="android.intent.category.LAUNCHER"> android:name="android.permission.FULLSCREEN">
Пример работы программы в режиме просмотра структуры #
Parsing file AndroidManifest.xml in package: C:\Users\Nikolay\Downloads\games\1 vs 100 (2.3.4).apk 0. Offset 0 : Chunk type 0x0003, header size 8 bytes, chunk size 1804 bytes File. 1. Offset 8 : Chunk type 0x0001, header size 28 bytes, chunk size 924 bytes Strings 25 (extra 0x00000000, 0x00000000, 0x00000080, 0x00000000) 0. "versionName" 1. "versionCode" 2. "name" 3. "icon" 4. "label" 5. "configChanges" 6. "screenOrientation" 7. "android" 8. "http://schemas.android.com/apk/res/android" 9. "" 10. "package" 11. "manifest" 12. "com.gameloft.android.Gloft11US" 13. "2.3.4" 14. "uses-permission" 15. "android.permission.VIBRATE" 16. "application" 17. "activity" 18. "Gloft11US" 19. "intent-filter" 20. "action" 21. "android.intent.action.MAIN" 22. "category" 23. "android.intent.category.LAUNCHER" 24. "android.permission.FULLSCREEN" 2. Offset 932 : Chunk type 0x0180, header size 8 bytes, chunk size 36 bytes Unknown. Data (28 bytes): 0x1c 0x02 0x01 0x01 0x1b 0x02 0x01 0x01 0x03 0x00 0x01 0x01 0x02 0x00 0x01 0x01 0x01 0x00 0x01 0x01 0x1f 0x00 0x01 0x01 0x1e 0x00 0x01 0x01 3. Offset 968 : Chunk type 0x0100, header size 16 bytes, chunk size 24 bytes number 2 param1 0xffffffff param2 0x00000007 (namespace) param3 0x00000008 (url) Name space begin. xmlns:android="http://schemas.android.com/apk/res/android" 4. Offset 992 : Chunk type 0x0102, header size 16 bytes, chunk size 96 bytes number 2 param1 0xffffffff param2 0xffffffff param3 0x0000000b (tag name) android:versionCode="234" [select] android:versionName="2.3.4" [string] package="com.gameloft.android.Gloft11US" [string]> 5. Offset 1088 : Chunk type 0x0102, header size 16 bytes, chunk size 56 bytes number 6 param1 0xffffffff param2 0xffffffff param3 0x0000000e (tag name) android:name="android.permission.VIBRATE" [string]> 6. Offset 1144 : Chunk type 0x0103, header size 16 bytes, chunk size 24 bytes number 6 param1 0xffffffff param2 0xffffffff param3 0x0000000e (tag name) 7. Offset 1168 : Chunk type 0x0102, header size 16 bytes, chunk size 76 bytes number 7 param1 0xffffffff param2 0xffffffff param3 0x00000010 (tag name) android:label="7f040011" [reference] android:icon="7f020000" [reference]> 8. Offset 1244 : Chunk type 0x0102, header size 16 bytes, chunk size 116 bytes number 10 param1 0xffffffff param2 0xffffffff param3 0x00000011 (tag name) android:label="7f040011" [reference] android:name="Gloft11US" [string] android:screenOrientation="1" [select] android:configChanges="240" [number]> 9. Offset 1360 : Chunk type 0x0102, header size 16 bytes, chunk size 36 bytes number 15 param1 0xffffffff param2 0xffffffff param3 0x00000013 (tag name) 10. Offset 1396 : Chunk type 0x0102, header size 16 bytes, chunk size 56 bytes number 16 param1 0xffffffff param2 0xffffffff param3 0x00000014 (tag name) android:name="android.intent.action.MAIN" [string]> 11. Offset 1452 : Chunk type 0x0103, header size 16 bytes, chunk size 24 bytes number 16 param1 0xffffffff param2 0xffffffff param3 0x00000014 (tag name) 12. Offset 1476 : Chunk type 0x0102, header size 16 bytes, chunk size 56 bytes number 17 param1 0xffffffff param2 0xffffffff param3 0x00000016 (tag name) android:name="android.intent.category.LAUNCHER" [string]> 13. Offset 1532 : Chunk type 0x0103, header size 16 bytes, chunk size 24 bytes number 17 param1 0xffffffff param2 0xffffffff param3 0x00000016 (tag name) 14. Offset 1556 : Chunk type 0x0103, header size 16 bytes, chunk size 24 bytes number 18 param1 0xffffffff param2 0xffffffff param3 0x00000013 (tag name) 15. Offset 1580 : Chunk type 0x0103, header size 16 bytes, chunk size 24 bytes number 19 param1 0xffffffff param2 0xffffffff param3 0x00000011 (tag name) 16. Offset 1604 : Chunk type 0x0103, header size 16 bytes, chunk size 24 bytes number 20 param1 0xffffffff param2 0xffffffff param3 0x00000010 (tag name) 17. Offset 1628 : Chunk type 0x0100, header size 16 bytes, chunk size 24 bytes number 21 param1 0xffffffff param2 0x00000007 (namespace) param3 0x00000008 (url) Name space begin. xmlns:android="http://schemas.android.com/apk/res/android" 18. Offset 1652 : Chunk type 0x0102, header size 16 bytes, chunk size 56 bytes number 21 param1 0xffffffff param2 0xffffffff param3 0x0000000e (tag name) android:name="android.permission.FULLSCREEN" [string]> 19. Offset 1708 : Chunk type 0x0103, header size 16 bytes, chunk size 24 bytes number 21 param1 0xffffffff param2 0xffffffff param3 0x0000000e (tag name) 20. Offset 1732 : Chunk type 0x0101, header size 16 bytes, chunk size 24 bytes number 21 param1 0xffffffff param2 0x00000007 (namespace) param3 0x00000008 (url) Name space end. xmlns:android="http://schemas.android.com/apk/res/android" 21. Offset 1756 : Chunk type 0x0103, header size 16 bytes, chunk size 24 bytes number 22 param1 0xffffffff param2 0xffffffff param3 0x0000000b (tag name) 22. Offset 1780 : Chunk type 0x0101, header size 16 bytes, chunk size 24 bytes number 22 param1 0xffffffff param2 0x00000007 (namespace) param3 0x00000008 (url) Name space end. xmlns:android="http://schemas.android.com/apk/res/android" Succeeded.
Файл AndroidManifest.xml
Файл AndroidManifest.xml , который также называется манифестом, включает информацию, которая применяется для выполнения приложения на платформе Android и корректной фильтрации на Google Play.
Благодаря этому можно скрывать приложение от пользователей, просматривающих Google Play и использующих устройства, несовместимые с этим приложением. Например, пользователи устройств без встроенной камеры не смогут получить доступ к приложениям, требующим камеру (это требование указывается в манифесте приложения). Манифест автоматически создается модулем ADT Plugin для Eclipse, и перед загрузкой приложения на Google Play потребуется вручную добавить в манифест необходимую информацию. Манифест, представляющий собой XML-файл, можно редактировать вручную либо с помощью программы Android Manifest Editor. Эта программа включена в состав модуля ADT Plugin для Eclipse.
Чтобы получить доступ к редактору Android Manifest Editor в среде Eclipse, выберите вкладку Packages Explorer (Просмотр пакетов) и дважды щелкните на файле AndroidManifest.xml, находящемся в папке приложения. После этого файл откроется в рабочей среде Eclipse. Выберите вкладку Manifest (Манифест), находящуюся в нижней части страницы рабочей среды, для перехода к странице Manifest General Attributes (Общие атрибуты манифеста). На этой странице следует указать основные сведения о приложении, такие как названия пакетов, номера версий и элементы. В табл. 2.5 перечислены некоторые общие элементы, включенные в манифест. Полный перечень элементов можно найти на веб-сайте developer.android.com.
Как только необходимые сведения будут внесены в манифест, вернитесь на страницу Manifest General Attributes для подготовки приложения к распространению.
Таблица 2.5. Некоторые общие элементы манифеста приложения
| Элемент | Описание |
|---|---|
| Uses Feature (Применения свойств) | Определяет свойства, используемые приложением. |
| Protected Broadcast (Защищенная трансляция) | Определяет название защищенной трансляции, которая позволяет приложению объявлять, что только оно может отсылать транслированное содержимое |
| Supports Screens (Поддержка экранов) | Определяет физические размеры экрана (Small (маленький), Normal (обычный), Large (большой), XLarge (сверхбольшой), Resizeable (с изменяемыми размерами)) и разрешения экрана (плотность пикселей на экране), поддерживаемые приложением. Для каждого параметра выберите значение true или false |
| Uses Configuration (Применения конфигурации) | Определяет требования к аппаратным средствам со стороны приложения. Этот элемент может принимать следующие значения: Touch screen (Сенсорный экран), Keyboard type (Тип клавиатуры), Hard keyboard (Физическая клавиатура), Navigation (Навигация) (например, трекбол или колесико) или Five way nav key (Пятипозиционная навигационная клавиша) (трекбол или клавиша, с помощью которой можно перемещаться верх, вниз, вправо или влево, а также выбирать элемент на экране) |
| Uses SDK (Применения SDK) | Функции SDK требуются для корректного выполнения приложения (функции, специфичные для платформ Android 2.3, 3.0 и более старших). Обратите внимание, что в результате установки этого флага приложение, разработанное на основе текущей библиотеки Android SDK, может выполняться на устройстве, на котором установлена более ранняя версия SDK. При этом не производится вызов API, не поддерживаемых в этой ранней версии |
На вкладке Application (Приложение), находящейся в нижней части окна приложения, определяются специфичные для приложения атрибуты, в том числе пиктограмма, атрибуты описания, разрешения, отладки и ряд других. На вкладке Permissions (Разрешения) определяется, должно ли приложение использовать защищенные свойства устройства (свойства, для доступа к которым требуются разрешения, например написание SMS-сообщений, настройка обоев или доступа к местоположению). Перед установкой приложения Google Play отображает перечень разрешений, требуемых приложением. Следует запрашивать только те разрешения, которые приложение может обрабатывать корректно. Список разрешений приводится на веб-сайте developer.android.com/reference/android/Manifest.permission.html.