Объект 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 с необязательными фрагментами манифеста ODM.
 -  
/vendor/manifest.xml(устаревший, без фрагментов) 
Обратите внимание, что:
- На устаревших устройствах используется устаревший манифест поставщика и манифест 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;
 - версии ВНДК;
 - Версия системного 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 к любому модулю. Например, вы можете модифицировать модуль с помощью своей реализации 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 , используйте type framework вместо type 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>Схема файла манифеста
 В этом разделе описывается значение этих тегов XML. Некоторые «обязательные» теги могут отсутствовать в исходном файле в дереве исходного кода Android и быть записаны assemble_vintf во время сборки. Необходимые теги должны присутствовать в соответствующих файлах на устройстве.
-  
?xml - По желанию. Предоставляет информацию только парсеру XML.
 -  
manifest.version - Необходимый. Мета-версия этого манифеста. Описывает элементы, ожидаемые в манифесте. Не имеет отношения к версии XML.
 -  
manifest.type -  Необходимый. Тип этого манифеста. Он имеет значение 
deviceдля файла манифеста устройства иframeworkдля файла манифеста платформы. -  
manifest.target-level - Требуется для манифеста устройства. Указывает версию матрицы совместимости платформы (FCM), с которой должен быть совместим этот манифест устройства. Это также называется транспортной версией устройства FCM.
 -  
manifest.hal -  Необязательно, могу повторить. Один HAL (HIDL или родной, например GL), в зависимости от атрибута 
format. -  
manifest.hal.format -  По желанию. Значение может быть одним из:
-  
hidl: HIDL HAL. Это значение по умолчанию. -  
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: режим связывания -  
passthrough: сквозной режим 
 -  
 -  Необязательно, когда 
manifest.hal.format == "aidl". В противном случае НЕ ДОЛЖЕН присутствовать. Указывает, какой транспорт используется при удаленном обслуживании интерфейса. Значение должно быть:-  
inet: инет-сокет 
manifest.hal.transport.ipиmanifest.hal.transport.portдолжны использоваться для дальнейшего указания информации о подключении к Inet. -  
 -  
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>содержит версию.
Для AIDL HAL<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>s. Описывает набор моментальных снимков 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. Подробности смотрите в правилах соответствия ядра .