- Файл манифеста AndroidManifest.xml
- Назначение файла
- Общая структура манифеста
- Описание
- Атрибуты
- Метаданные привязок Java
- Обзор
- Файл преобразования Metadata.xml
- Добавление типов
- Удаление типов
- Переименование членов
- Переименование классов-оболочек EventArg
- Поддерживаемые атрибуты
- argsType
- eventName
- managedName
- ManagedType
- managedReturn
- obfuscated
- propertyName
- отправитель
- видимость
- Файлы EnumFields.xml и EnumMethods.xml
- Определение перечисления с помощью файла EnumFields.xml
- Определение методов получения и задания с помощью файла EnumMethods.xml
Файл манифеста AndroidManifest.xml
Файл манифеста AndroidManifest.xml предоставляет основную информацию о программе системе. Каждое приложение должно иметь свой файл AndroidManifest.xml. Редактировать файл манифеста можно вручную, изменяя XML-код или через визуальный редактор Manifest Editor (Редактор файла манифеста), который позволяет осуществлять визуальное и текстовое редактирование файла манифеста приложения.
Назначение файла
- объявляет имя Java-пакета приложения, который служит уникальным идентификатором;
- описывает компоненты приложения — деятельности, службы, приемники широковещательных намерений и контент-провайдеры, что позволяет вызывать классы, которые реализуют каждый из компонентов, и объявляет их намерения;
- содержит список необходимых разрешений для обращения к защищенным частям API и взаимодействия с другими приложениями;
- объявляет разрешения, которые сторонние приложения обязаны иметь для взаимодействия с компонентами данного приложения;
- объявляет минимальный уровень API Android, необходимый для работы приложения;
- перечисляет связанные библиотеки;
Общая структура манифеста
Файл манифеста инкапсулирует всю архитектуру Android-приложения, его функциональные возможности и конфигурацию. В процессе разработки приложения вам придется постоянно редактировать данный файл, изменяя его структуру и дополняя новыми элементами и атрибутами.
Корневым элементом манифеста является . Помимо данного элемента обязательными элементами является теги и . Элемент является основным элементом манифеста и содержит множество дочерних элементов, определяющих структуру и работу приложения. Порядок расположения элементов, находящихся на одном уровне, произвольный. Все значения устанавливаются через атрибуты элементов. Кроме обязательных элементов, упомянутых выше, в манифесте по мере необходимости используются другие элементы.
Описание
Элемент является корневым элементом манифеста. По умолчанию Eclipse создает элемент с четырьмя атрибутами:
Атрибуты
объявляет разрешение, которое используется для ограничения доступа к определенным компонентам или функциональности данного приложения. В этой секции описываются права, которые должны запросить другие приложения для получения доступа к вашему приложению. Приложение может также защитить свои собственные компоненты (деятельности, службы, приемники широковещательных намерений и контент-провайдеры) разрешениями. Оно может использовать любое из системных разрешений, определенных 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 элемента
Источник
Метаданные привязок Java
В настоящее время рассматривается возможность использования настраиваемых привязок на платформе Xamarin. Примите участие в этом опросе, чтобы помочь определить дальнейшие направления разработки.
Код C# в Xamarin.Android вызывает библиотеки Java с помощью привязок, которые являются механизмом для абстрагирования низкоуровневых сведений, указанных в собственном интерфейсе Java (JNI). Xamarin.Android предоставляет средство, создающее эти привязки. С помощью этого средства разработчик может управлять способами создания привязок с использованием метаданных, что позволяет выполнять такие процедуры, как изменение пространств имен и переименование членов. В этом документе описывается, как работают метаданные, перечислены атрибуты, поддерживаемые метаданными, и объясняется, как устранить проблемы привязки путем изменения этих метаданных.
Обзор
Библиотека привязки Java Xamarin.Android предназначена автоматизировать большую часть работы по привязке существующей библиотеки Android с помощью средства, которое иногда называют генератором привязок. Если выполняется привязка библиотеки Java, Xamarin.Android проверяет классы Java и создает список всех пакетов, типов и элементов, которые должны быть привязаны. Этот список интерфейсов API хранится в XML-файле, который можно найти в папке
Генератор привязок будет использовать файл api.xml как основу для создания необходимых классов-оболочек C#. Содержимое этого файла XML является разновидностью формата Android Open Source Project Google. Ниже приведен пример содержимого файла api.xml:
В этом примере api.xml объявляет класс в пакете с именем Manifest , который расширяет java.lang.Object .
Во многих случаях требуется участие человека, чтобы сделать API Java похожим на .NET или устранить проблемы, препятствующие компиляции сборки привязки. Например, может потребоваться изменить имена пакетов Java на пространства имен .NET, переименовать класс или изменить тип возвращаемого значения метода.
Эти изменения не внедряются путем прямого изменения файла api.xml. Вместо этого изменения записываются в специальные файлы XML, предоставляемые шаблоном библиотеки привязки Java. На генератор привязок будут влиять файлы сопоставления при создании и компиляции сборки привязки Xamarin.Android.
Эти файлы сопоставления XML можно найти в папке проекта Transforms:
MetaData.xml — позволяет вносить изменения в окончательный API, например изменять пространство имен созданной привязки.
EnumFields.xml — содержит сопоставление между константами Java и C# enums .
EnumMethods.xml — позволяет изменять параметры методов и возвращаемые типы из констант Java в C# enums .
Файл MetaData.xml — самый важный, так как он позволяет вносить изменения общего назначения в привязку, например:
Переименование пространств имен, классов, методов или полей, чтобы они следовали соглашениям .NET.
Удаление пространств имен, классов, методов или полей, которые не требуются.
перемещать классы в разные пространства имен;
Добавление дополнительных классов поддержки для обеспечения разработки привязки после шаблонов .NET Framework.
Рассмотрим Metadata.xml более детально.
Файл преобразования Metadata.xml
Как уже указано, файл Metadata.xml использует генератор привязок, чтобы повлиять на создание сборки привязки. В формате метаданных используется синтаксис XPath и он практически идентичен метаданным GAPI, которые описаны в этом разделе руководства. Эта реализация является почти полной реализацией XPath 1.0 с такой же поддержкой элементов в стандарте 1.0. Этот файл является мощным механизмом на основе XPath для изменения, добавления, скрытия или перемещения любого элемента или атрибута в файле API. Все элементы правил в спецификации метаданных включают в себя атрибут path (пути) для указания узла, к которому должно применяться правило. Правила применяются в следующем порядке:
- Add-Node — добавляет дочерний узел к узлу, заданному атрибутом path.
- attr — задает значение атрибута элемента, заданного атрибутом path.
- Remove-node — удаляет узлы, соответствующие заданному XPath.
Далее приведен пример файла Metadata.xml:
Ниже перечислены некоторые из наиболее часто используемых элементов XPath для API Java.
interface — Используется для нахождение интерфейса Java. Например, /interface[@name=’AuthListener’] .
class — Используется для нахождение класса. Например, /class[@name=’MapView’] .
method — Используется для нахождение метода в классе или интерфейсе Java. Например, /class[@name=’MapView’]/method[@name=’setTitleSource’] .
parameter — Определяет параметр для метода. Например, /parameter[@name=’p0′]
Добавление типов
add-node Элемент сообщит проекту привязки Xamarin. Android добавить новый класс-оболочку для add-node . Например, следующий фрагмент кода будет направлять генератор привязки для создания класса с конструктором и одним полем:
Удаление типов
Можно указать генератору привязок Xamarin.Android игнорировать тип Java, а не привязывать его. Это можно сделать, добавив remove-node элемент XML в файл remove-node :
Переименование членов
Нельзя переименовать члены, напрямую отредактировав файл api.xml, так как для Xamarin.Android требуются исходные имена собственного интерфейса Java (JNI). Поэтому атрибут //class/@name изменить нельзя. Если сделать это, привязка не будет работать.
Рассмотрим случай, когда нужно переименовать тип android.Manifest . Для этого мы можем попытаться напрямую изменить api.xml и переименовать класс следующим образом:
Это приведет к созданию в генераторе привязок следующего кода C# для класса-оболочки:
Обратите внимание, что класс-оболочка переименован в NewName , а исходный тип Java — все еще Manifest . Класс привязки Xamarin.Android больше не может получить доступ к каким-либо методам android.Manifest . Класс-оболочка привязан к несуществующему типу Java.
Чтобы правильно изменить управляемое имя упакованного типа (или метода), необходимо задать атрибут managedName , как показано в этом примере:
Переименование классов-оболочек EventArg
Когда генератор привязки Xamarin. Android определяет onXXX метод задания для onXXX , создается событие C# и EventArgs подкласс для поддержки API-интерфейса .NET флавауред для шаблона прослушивателя на основе Java. В качестве примера рассмотрим следующий класс и метод Java:
Xamarin.Android удалит префикс on из метода задания, а вместо этого использует 2DSignNextManuever в качестве основы для имени подкласса EventArgs . Подкласс будет называться примерно так:
Это имя класса C# недопустимо. Чтобы устранить эту проблему, автор привязки должен использовать атрибут argsType и указать допустимое имя C# для подкласса EventArgs :
Поддерживаемые атрибуты
В следующих разделах описаны некоторые атрибуты для преобразования API Java.
argsType
Этот атрибут помещается в методы задания, чтобы присвоить имя подклассу EventArg , который будет создан для поддержки прослушивателей Java. Более подробно это описано в разделе Переименование классов-оболочек EventArg этого руководства.
eventName
Задает имя для события. Если значение пустое, то событие не создается. Более подробно это описано в разделе Переименование классов-оболочек EventArg.
managedName
Используется для изменения имени пакета, класса, метода или параметра. Например, чтобы изменить имя класса Java MyClass на NewClassName :
В следующем примере показано выражение XPath для переименования метода java.lang.object.toString на Java.Lang.Object.NewManagedName :
ManagedType
managedType используется для изменения типа возвращаемого значения метода. В некоторых ситуациях генератор привязок неправильно определяет тип возвращаемого значения метода Java, что приводит к ошибке времени компиляции. Одним из возможных решений в этой ситуации является изменение типа возвращаемого значения метода.
Например, генератор привязок считает, что метод Java de.neom.neoreadersdk.resolution.compareTo() должен возвращать int Параметры и, что приводит к ошибке сообщения об ошибке Object de.neom.neoreadersdk.resolution.compareTo() . В следующем фрагменте кода показано, как изменить тип первого параметра, созданного методом C#, с DE.Neom.Neoreadersdk.Resolution на Java.Lang.Object :
managedReturn
Изменяет тип возвращаемого значения метода. Это не изменит атрибут возвращаемого значения (так как изменения таких атрибутов могут привести к несовместимости изменений в сигнатуре JNI). В следующем примере тип возвращаемого значения метода append изменяется с SpannableStringBuilder на IAppendable (повторный вызов C# не поддерживает ковариантные типы возвращаемых данных):
obfuscated
Средства обфускации кода в библиотеках Java могут конфликтовать с генератором привязок Xamarin.Android и помешать ему создать классы-оболочки C#. Характеристики классов obfuscated включают в себя:
- имя класса содержит символ $ , например $;
- имя класса написано полностью строчными буквами, например a.class.
Ниже приведен пример того, как создать «немаскированный» тип C#:
propertyName
Этот атрибут можно использовать для изменения имени управляемого свойства.
Особым случаем использования propertyName является ситуация, когда у класса Java есть только метод получения для поля. В этом случае генератору привязки нужно создать свойство доступное только для записи, что не рекомендуется в .NET. В следующем фрагменте кода показано, как «удалить» свойства .NET, установив для propertyName пустую строку:
Обратите внимание, что генератор привязок по-прежнему будет создавать методы задания и получения.
отправитель
Указывает, какой параметр метода должен быть параметром sender , если метод сопоставлен с событием. Значением может быть true или false . Пример:
видимость
Этот атрибут используется для изменения видимости класса, метода или свойства. Например, может потребоваться повысить уровень метода Java protected таким образом, чтобы у него была соответствующая программа-оболочка C# public :
Файлы EnumFields.xml и EnumMethods.xml
Бывают случаи, когда библиотеки Android используют целочисленные константы для представления состояний, передаваемых в свойства или методы библиотек. Во многих случаях полезно привязать такие константы к перечислениям в C#. Чтобы упростить это сопоставление, используйте файлы EnumFields.xml и EnumMethods.xml в проекте привязки.
Определение перечисления с помощью файла EnumFields.xml
Файл EnumFields.xml содержит сопоставление между константами Java и C# enums . Рассмотрим следующий пример перечисления C#, создаваемого для набора констант int :
Здесь мы воспользовались классом Java SKRealReachSettings и определили перечисление C# с именем SKMeasurementUnit в пространстве имен Skobbler.Ngx.Map.RealReach . Записи field определяют имя константы Java (например, UNIT_SECOND ), имя записи перечисления (например, Second ) и целочисленное значение, представленное обеими сущностями (например, 0 ).
Определение методов получения и задания с помощью файла EnumMethods.xml
Файл EnumMethods.xml позволяет изменять параметры метода и возвращаемые типы из констант Java в C# enums . Иными словами, он сопоставляет чтение и запись перечислений C# (определенных в файле EnumFields.xml ) с константой get и set методами Java.
Учитывая приведенное SKRealReachSettings выше перечисление, в следующем SKRealReachSettings файле определяется метод получения или задания для этого перечисления:
Первая строка method сопоставляет возвращаемое значение метода Java getMeasurementUnit с перечислением SKMeasurementUnit . Вторая строка method сопоставляет первый параметр setMeasurementUnit с тем же перечислением.
Источник