Объект VINTF агрегирует данные из файлов манифеста устройства и манифеста фреймворка (XML). Оба манифеста имеют одинаковый формат, но не все элементы применимы к обоим (подробнее о схеме файла манифеста…).
Манифест устройства
Манифест устройства (предоставляется устройством) состоит из манифеста поставщика и манифеста ODM.
- В манифесте поставщика указываются HAL, версии правил SELinux и другие компоненты, общие для SoC. Рекомендуется размещать его в дереве исходного кода Android по адресу
device/VENDOR/DEVICE/manifest.xml, но можно использовать несколько файлов фрагментов. Подробнее о фрагментах манифеста и создании DM на основе фрагментов. - В манифесте ODM перечислены HAL, относящиеся к определенному продукту и находящиеся в разделе ODM.
Объект VINTF загружает манифест ODM в следующем порядке:
- Если задано значение
SKU(гдеSKU– значение свойстваro.boot.product.hardware.sku),/odm/etc/vintf/manifest_SKU.xml /odm/etc/vintf/manifest.xml- Если задано свойство
SKU, для свойства/odm/etc/manifest_SKU.xml /odm/etc/manifest.xml
- Если задано значение
- В манифесте поставщика перечислены HAL, относящиеся к определенному продукту и находящиеся в разделе поставщика.
Объект VINTF загружает манифест поставщика в следующем порядке:
- Если задано значение
SKU(гдеSKU– значение свойстваro.boot.product.vendor.sku),/vendor/etc/vintf/manifest_SKU.xml /vendor/etc/vintf/manifest.xml
- Если задано значение
- Объект VINTF загружает манифест устройства в следующем порядке:
- Если манифест поставщика существует, объедините следующие данные:
- Манифест поставщика
- Необязательные фрагменты манифеста поставщика
- Необязательный манифест ODM
- Необязательные фрагменты манифеста ODM
- В противном случае, если манифест ODM существует, объедините его с фрагментами манифеста ODM (необязательно).
/vendor/manifest.xml(устаревший, без фрагментов)- Наконец, объедините фрагменты манифеста из любых APEX-пакетов поставщиков. Фрагменты манифеста загружаются из каталога
etc/vintfкаждого пакета APEX (например,/apex/<apex name>/etc/vintf).
Примечания
- На устаревших устройствах используются устаревший манифест поставщика и манифест ODM. Манифест ODM может полностью переопределить манифест поставщика устаревшей версии.
- На устройствах с Android 9 манифест ODM объединяется с манифестом поставщика.
- При объединении списка манифестов теги в манифестах, которые идут в списке позже, могут переопределять теги в манифестах, которые идут в списке раньше, если теги в более позднем манифесте имеют атрибут
override="true". Например, манифест ODM может переопределить некоторые теги<hal>из манифеста поставщика. Ознакомьтесь с документацией по атрибутуoverrideниже.
- Если манифест поставщика существует, объедините следующие данные:
Такая конфигурация позволяет нескольким продуктам с одной и той же платой использовать одно и то же изображение поставщика (которое предоставляет общие HAL), но при этом иметь разные изображения ODM (которые указывают HAL, относящиеся к определенному продукту).
Ниже приведен пример манифеста поставщика.
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <manifest version="2.0" type="device" target-level="1"> <hal> <name>android.hardware.camera</name> <transport>hwbinder</transport> <version>3.4</version> <interface> <name>ICameraProvider</name> <instance>legacy/0</instance> <instance>proprietary/0</instance> </interface> </hal> <hal> <name>android.hardware.nfc</name> <transport>hwbinder</transport> <version>1.0</version> <version>2.0</version> <interface> <name>INfc</name> <instance>nfc_nci</instance> </interface> </hal> <hal> <name>android.hardware.nfc</name> <transport>hwbinder</transport> <fqname>@2.0::INfc/default</fqname> </hal> <hal> <name>android.hardware.drm</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>ICryptoFactory</name> <instance>default</instance> </interface> <interface> <name>IDrmFactory</name> <instance>default</instance> </interface> <fqname>@1.1::ICryptoFactory/clearkey</fqname> <fqname>@1.1::IDrmFactory/clearkey</fqname> </hal> <hal format="aidl"> <name>android.hardware.light</name> <version>1</version> <fqname>ILights/default</fqname> </hal> <hal format="aidl"> <name>android.hardware.power</name> <version>2</version> <interface> <name>IPower</name> <instance>default</instance> </interface> </hal> <hal format="native"> <name>EGL</name> <version>1.1</version> </hal> <hal format="native"> <name>GLES</name> <version>1.1</version> <version>2.0</version> <version>3.0</version> </hal> <sepolicy> <version>25.0</version> </sepolicy> </manifest>
Ниже приведен пример манифеста ODM.
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <manifest version="1.0" type="device"> <!-- camera 3.4 in vendor manifest is ignored --> <hal override="true"> <name>android.hardware.camera</name> <transport>hwbinder</transport> <version>3.5</version> <interface> <name>ICameraProvider</name> <instance>legacy/0</instance> </interface> </hal> <!-- NFC is declared to be disabled --> <hal override="true"> <name>android.hardware.nfc</name> <transport>hwbinder</transport> </hal> <hal> <name>android.hardware.power</name> <transport>hwbinder</transport> <version>1.1</version> <interface> <name>IPower</name> <instance>default</instance> </interface> </hal> </manifest>
Ниже приведен пример манифеста устройства в пакете OTA.
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <manifest version="1.0" type="device" target-level="1"> <!-- hals ommited --> <kernel version="4.4.176"> <config> <key>CONFIG_ANDROID</key> <value>y</value> </config> <config> <key>CONFIG_ARM64</key> <value>y</value> </config> <!-- other configs ommited --> </kernel> </manifest>
Подробнее о разработке манифеста устройства…
Манифест фреймворка
Файл манифеста фреймворка состоит из манифеста системы, манифеста продукта и манифеста system_ext.
-
Манифест системы (предоставляется Google) создается вручную и находится в дереве исходного кода Android по адресу
/system/libhidl/manifest.xml. - В манифесте продукта (предоставляется устройством) перечислены HAL, обслуживаемые модулями, установленными в разделе продукта.
-
В манифесте system_ext (предоставляется устройством) указано следующее:
- HAL, обслуживаемые модулями, установленными в разделе system_ext;
- версии VNDK;
- Версия системного SDK.
Как и в случае с манифестом устройства, можно использовать несколько файлов фрагментов. Подробнее о фрагментах манифеста…
Ниже приведен пример манифеста фреймворка.
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <manifest version="1.0" type="framework"> <hal> <name>android.hidl.allocator</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>IAllocator</name> <instance>ashmem</instance> </interface> </hal> <hal> <name>android.hidl.memory</name> <transport arch="32+64">passthrough</transport> <version>1.0</version> <interface> <name>IMapper</name> <instance>ashmem</instance> </interface> </hal> <hal> <name>android.hidl.manager</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>IServiceManager</name> <instance>default</instance> </interface> </hal> <hal> <name>android.frameworks.sensorservice</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>ISensorManager</name> <instance>default</instance> </interface> </hal> <hal max-level="5"> <name>android.frameworks.schedulerservice</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>ISchedulingPolicyService</name> <instance>default</instance> </interface> </hal> <vendor-ndk> <version>27</version> </vendor-ndk> <system-sdk> <version>27</version> </system-sdk> </manifest>
Фрагменты манифеста
В Android 10 и более поздних версий можно связать запись манифеста с модулем HAL в системе сборки. Это упрощает условное включение модуля HAL в систему сборки.
Пример
В файле Android.bp или Android.mk добавьте vintf_fragments в любой модуль, который явно установлен на устройстве, например cc_binary или rust_binary.
Например, вы можете изменить модуль, используя собственную реализацию HAL (my.package.foo@1.0-service-bar).
... { ... vintf_fragments: ["manifest_foo.xml"], ... }
LOCAL_MODULE := ... LOCAL_VINTF_FRAGMENTS := manifest_foo.xml
Создайте манифест для этого модуля в файле с названием manifest_foo.xml. Во время сборки этот манифест добавляется на устройство. Добавление записи здесь аналогично добавлению записи в основной манифест устройства.
Это позволяет клиентам использовать интерфейс, а VTS – определять, какие реализации HAL есть на устройстве. Он выполняет те же функции, что и обычный манифест.
В приведенном ниже примере реализован параметр android.hardware.foo@1.0::IFoo/default, который устанавливается в раздел vendor или odm. Если он установлен в разделе system, product или system_ext, используйте тип framework вместо типа device.
<manifest version="1.0" type="device"> <hal format="hidl"> <name>android.hardware.foo</name> <transport>hwbinder</transport> <fqname>@1.0::IFoo/default</fqname> </hal> </manifest>
Если модуль HAL упакован в пакет APEX поставщика, упакуйте связанные с ним фрагменты VINTF в тот же пакет APEX с помощью prebuilt_etc, как описано в разделе Фрагменты VINTF.
Схема файла манифеста
В этом разделе описывается значение этих тегов XML. Некоторые обязательные теги могут отсутствовать в исходном файле в дереве исходного кода Android и добавляться assemble_vintf во время сборки. Обязательные теги должны присутствовать в соответствующих файлах на устройстве.
?xml- Необязательный параметр. Предоставляет информацию только для парсера XML.
manifest.version- Обязательный параметр. Метаверсия этого манифеста. Описывает элементы, которые должны быть в манифесте. Не связано с версией XML.
manifest.type- Обязательный параметр. Тип манифеста. В файле манифеста устройства используется значение
device, а в файле манифеста фреймворка –framework. manifest.target-level- Обязательно для манифеста устройства. Указывает версию матрицы совместимости фреймворка (FCM), с которой должен быть совместим манифест устройства. Это также называется версией FCM, установленной на устройстве при его продаже.
manifest.hal- Необязательный элемент, может повторяться. Один уровень абстрагирования оборудования (HIDL или собственный, например GL),
в зависимости от атрибута
format. manifest.hal.format- Необязательный параметр. Возможные значения:
hidl: HAL HIDL. Это значение используется по умолчанию.aidl: AIDL HALs. Допустимо только для метаверсии манифеста 2.0 и выше.native– нативные HAL.
manifest.hal.max-level- Необязательный параметр. Действительно только для манифестов фреймворков. Если задано, HAL с максимальным уровнем ниже, чем целевая версия FCM в манифесте фреймворка, отключаются.
manifest.hal.override- Необязательный параметр. Возможные значения:
true: переопределяет другие элементы<hal>с тем же значением<name>и основной версией. Если в элементе<hal>нет элементов<version>или<fqname>, то элемент<hal>объявляет, что этот HAL отключен.false: не переопределяйте другие элементы<hal>с одинаковыми значениями<name>и основной версии.
manifest.hal.name- Обязательный параметр. Полное название пакета HAL. Несколько записей HAL могут использовать одно и то же имя. Примеры:
android.hardware.camera(HIDL или AIDL HAL)GLES(нативный HAL, требуется только имя)
manifest.hal.transport- Обязательный параметр, если указан параметр
manifest.hal.format == "hidl". В остальных случаях его быть не должно. Указывает, какой транспорт используется, когда интерфейс из этого пакета запрашивается у менеджера сервисов. Возможные значения:hwbinder: режим Binderizedpassthrough: режим передачи данных
- Необязательный атрибут, если указан атрибут "тип предложения"
manifest.hal.format == "aidl". В остальных случаях его быть не должно. Указывает, какой транспорт используется при удаленном обслуживании интерфейса. Значение должно быть следующим:inet: сокет Inet
manifest.hal.transport.ipиmanifest.hal.transport.port. manifest.hal.transport.arch- Обязательно для
passthroughи не должно присутствовать дляhwbinder. Разрядность сквозного сервиса. Возможные значения:32: 32-разрядный режим64: 64-разрядный режим32+64: оба
manifest.hal.transport.ip- Обязательно для
inetи не должно присутствовать в других случаях. IP-адрес, с которого обслуживается удаленный интерфейс. manifest.hal.transport.port- Обязательно для
inetи НЕ должно присутствовать в других случаях. Описывает порт, через который обслуживается удаленный интерфейс. manifest.hal.version- Необязательный, может повторяться. Версия для тегов
halв манифесте.
Для HIDL и нативных HAL используется форматMAJOR.MINOR. Примеры можно найти в разделахhardware/interfaces,vendor/${VENDOR}/interfaces,frameworks/hardware/interfacesиsystem/hardware/interfaces.
В HIDL и нативных HAL можно использовать несколько полей версии, если они представляют разные основные версии, при этом для каждой основной версии указывается только одна дополнительная версия. Например, версии 3.1 и 3.2 не могут существовать одновременно, а версии 1.0 и 3.4 – могут. Это относится ко всем элементамhalс одинаковым названием, если не задано свойствоoverride="true". Значения<version>не связаны с<fqname>, поскольку<fqname>содержит версию.
Для HAL-интерфейсов AIDL<version>не должен присутствовать на устройствах с Android 11 и более ранними версиями ОС.<version>должно быть целым числом на устройствах с Android 12 и более поздних версий. Для каждого кортежа(package, interface, instance)должно быть не более одного элемента<version>. Если он отсутствует, по умолчанию используется1. Значение<version>связано со всеми<fqname>в одном<hal>, потому что у<fqname>нет версии. manifest.hal.interface- Обязательный элемент, может повторяться без дубликатов. Укажите интерфейс в пакете, у которого есть название экземпляра. В элементе
<hal>может быть несколько элементов<interface>с разными названиями. manifest.hal.interface.name- Обязательный параметр. Название интерфейса.
manifest.hal.interface.instance- Обязательный элемент, можно повторять. Название экземпляра интерфейса. Может иметь несколько экземпляров для интерфейса, но не дублировать элементы
<instance>. manifest.hal.fqname- Необязательный элемент, может повторяться. Альтернативный способ указать экземпляр для HAL с именем
manifest.hal.name.- Для HIDL HAL используется формат
@MAJOR.MINOR::INTERFACE/INSTANCE. - Для AIDL HAL используется формат
INTERFACE/INSTANCE.
- Для HIDL HAL используется формат
manifest.sepolicy- Обязательный параметр. Содержит все записи, связанные с sepolicy.
manifest.sepolicy.version- Обязательно для манифеста устройства. Объявляет версию SELinux. Формат:
SDK_INT.PLAT_INT. manifest.vendor-ndk- Обязательный элемент, может повторяться. Требуется для манифеста фреймворка. Не должно быть в манифесте устройства. Если записей
<vendor-ndk>несколько, у них должны быть разные значения<version>. Описывает набор снимков VNDK, предоставляемых фреймворком. manifest.vendor-ndk.version- Обязательный параметр. Это положительное целое число, представляющее версию VNDK.
manifest.vendor-ndk.library- Необязательный атрибут, можно повторять без дубликатов. Описывает набор библиотек VNDK, предоставленных фреймворком для этого снимка VNDK поставщика. Значение – это название файла библиотеки, например
libjpeg.so, включая префиксlibи суффикс.so. Компоненты пути не допускаются. manifest.system-sdk.version- Необязательный элемент, может повторяться, но без дубликатов. Используется только фреймворком манифеста. Описывает набор версий системного SDK, предоставляемых фреймворком приложениям поставщика.
manifest.kernel- Необязательный параметр. Содержит статическую информацию о ядре.
manifest.kernel.target-level- Необязательный параметр. Описывает ветвь ядра. Если этот параметр не указан, по умолчанию используется значение
manifest.target-level. Значение должно быть больше или равноmanifest.target-level. Подробнее о правилах сопоставления ядер…