Манифесты

Объект VINTF агрегирует данные из файлов манифеста устройства и манифеста фреймворка (XML). Оба манифеста имеют одинаковый формат, но не все элементы применимы к обоим (подробнее о схеме файла манифеста…).

Манифест устройства

Манифест устройства (предоставляется устройством) состоит из манифеста поставщика и манифеста ODM.

  • В манифесте поставщика указываются HAL, версии правил SELinux и другие компоненты, общие для SoC. Рекомендуется размещать его в дереве исходного кода Android по адресу device/VENDOR/DEVICE/manifest.xml, но можно использовать несколько файлов фрагментов. Подробнее о фрагментах манифеста и создании DM на основе фрагментов.
  • В манифесте ODM перечислены HAL, относящиеся к определенному продукту и находящиеся в разделе ODM. Объект VINTF загружает манифест ODM в следующем порядке:
    1. Если задано значение SKU (где SKU – значение свойства ro.boot.product.hardware.sku), /odm/etc/vintf/manifest_SKU.xml
    2. /odm/etc/vintf/manifest.xml
    3. Если задано свойство SKU, для свойства /odm/etc/manifest_SKU.xml
    4. /odm/etc/manifest.xml
  • В манифесте поставщика перечислены HAL, относящиеся к определенному продукту и находящиеся в разделе поставщика. Объект VINTF загружает манифест поставщика в следующем порядке:
    1. Если задано значение SKU (где SKU – значение свойства ro.boot.product.vendor.sku), /vendor/etc/vintf/manifest_SKU.xml
    2. /vendor/etc/vintf/manifest.xml
  • Объект VINTF загружает манифест устройства в следующем порядке:
    1. Если манифест поставщика существует, объедините следующие данные:
      1. Манифест поставщика
      2. Необязательные фрагменты манифеста поставщика
      3. Необязательный манифест ODM
      4. Необязательные фрагменты манифеста ODM
    2. В противном случае, если манифест ODM существует, объедините его с фрагментами манифеста ODM (необязательно).
    3. /vendor/manifest.xml (устаревший, без фрагментов)
    4. Наконец, объедините фрагменты манифеста из любых 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: режим Binderized
  • passthrough: режим передачи данных
Необязательный атрибут, если указан атрибут "тип предложения" 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.
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. Подробнее о правилах сопоставления ядер…