Комплект для собственной разработки от поставщика (VNDK)

Комплект Vendor Native Development Kit (VNDK) - это набор библиотек, предназначенный исключительно для поставщиков для реализации своих HAL. В VNDK отгружается в system.img и динамически связан с кодом поставщика во время выполнения.

Почему ВНДК?

Android 8.0 и выше позволяет обновлять только платформу, в которой системный раздел может быть обновлен до последней версии, а разделы поставщика остаются неизменными. Это означает, что двоичные файлы, созданные в разное время, должны иметь возможность работать друг с другом; VNDK охватывает изменения API / ABI в выпусках Android.

Обновления только для платформы включают следующие проблемы:

  • Зависимость между каркасными модулями и модулями поставщиков. До Android 8.0 модули с обеих сторон могли связываться с модулями с другой стороны. Однако зависимости от модулей поставщика накладывают нежелательные ограничения на разработку модулей фреймворка.
  • Расширения библиотек AOSP. Android 8.0 и выше требует, чтобы все устройства Android прошли CTS, когда системный раздел заменен стандартным универсальным системным образом (GSI). Однако по мере того, как поставщики расширяют библиотеки AOSP для повышения производительности или добавления дополнительных функций для своих реализаций HIDL, прошивка системного раздела стандартным GSI может нарушить реализацию HIDL поставщика. (Для руководящих принципов , касающихся предотвращения таких обрывов см расширения VNDK .)

Для решения этих проблем, в Android 8.0 вводит несколько методов , такие как VNDK (описанный в данном разделе), HIDL , hwbinder, устройство наложение дерева и sepolicy наложение.

Ресурсы VNDK

Этот раздел включает следующие ресурсы VNDK:

  • Понятия VNDK (ниже) описывает рамочные совместно используемые библиотеки, тот же процесс HALS (SP-HALS), и терминология VNDK.
  • VNDK расширений классифицируют поставщик конкретных изменений в категорию. Например, библиотеки с расширенными функциями, от которых зависят модули поставщика, должны быть скопированы в раздел поставщика, но изменения, несовместимые с ABI, запрещены.
  • VNDK Сложение Система поддержка описывает систему построения конфигураций и синтаксис модуля определения, связанные с VNDK.
  • VNDK Definition Tool помогает выполнить миграцию исходного дерева на Android 8.0 и выше.
  • Пространство имена компоновщика обеспечивает точный контроль над общей библиотекой связей.
  • Справочники, Правила и sepolicy определяет структуру каталогов для устройств , работающих под управлением Android 8.0 и выше, правила VNDK, и связанные с ними sepolicy.
  • VNDK Дизайн презентация иллюстрирует основные понятия , используемые в ВДНХ Android 8.0 и выше.

Концепции ВНДК

В идеальном мире Android 8.0 и выше процессы фреймворка не загружают совместно используемые библиотеки поставщика, все процессы вендора загружают только совместно используемые библиотеки поставщика (и часть совместно используемых библиотек фреймворка), а взаимодействие между процессами фреймворка и процессами вендора регулируется HIDL и оборудованием. связующее.

Такой мир включает в себя возможность того, что стабильные общедоступные API-интерфейсы из общих библиотек фреймворка могут оказаться недостаточными для разработчиков модулей поставщика (хотя API-интерфейсы могут меняться между выпусками Android), требуя, чтобы некоторая часть общих библиотек фреймворка была доступна процессам поставщика. Кроме того, поскольку требования к производительности могут привести к компромиссу, некоторые HAL, критичные ко времени отклика, должны обрабатываться по-другому.

В следующих разделах подробно описано, как VNDK обрабатывает общие библиотеки платформы для поставщиков и HAL с одним процессом (SP-HAL).

Общие библиотеки Framework для поставщика

В этом разделе описаны критерии классификации разделяемых библиотек, доступных для процессов поставщика. Существует два подхода к поддержке модулей поставщиков в нескольких версиях Android:

  1. Стабилизировать ABI / API каркаса разделяемых библиотек. Новые модули инфраструктуры и модули старых поставщиков могут использовать одну и ту же общую библиотеку, чтобы уменьшить объем памяти и размер хранилища. Уникальная общая библиотека также позволяет избежать нескольких проблем с двойной загрузкой. Однако стоимость разработки для поддержки стабильных ABI / API высока, и нереально стабилизировать все ABI / API, экспортируемые каждой разделяемой библиотекой фреймворка.
  2. Скопируйте старые каркасные разделяемые библиотеки. Поставляется с строгим ограничением для побочных каналов, определяемых как все механизмы для взаимодействия между модулями инфраструктуры и модулями поставщика, включая (но не ограничиваясь) связыватель, сокет, канал, общую память, общий файл и системные свойства. Связь не должна быть, если протокол связи не заморожен и не стабилен (например, HIDL через hwbinder). Двойная загрузка разделяемых библиотек также может вызвать проблемы; например, если объект, созданный новой библиотекой, передается функциям из старой библиотеки, может возникнуть ошибка, поскольку эти библиотеки могут интерпретировать объект по-разному.

В зависимости от характеристик разделяемых библиотек используются разные подходы. В результате общие библиотеки фреймворка подразделяются на три подкатегории:

  • LL-NDK Библиотеки Framework Общие библиотеки , которые , как известно, быть стабильным. Их разработчики стремятся поддерживать стабильность своих API / ABI.
    • МР-НДК включает в себя следующие библиотеки: libEGL.so , libGLESv1_CM.so , libGLESv2.so , libGLESv3.so , libandroid_net.so , libc.so , libdl.so , liblog.so , libm.so , libnativewindow.so , libneuralnetworks.so , libsync.so , libvndksupport.so и libvulkan.so ,
  • Приемлемые VNDK Библиотеки (VNDK) являются Рамочными общими библиотеками , которые являются безопасными для копирования дважды. Framework модули и модули Vendor можно связать со своими копиями. Общая библиотека фреймворка может стать подходящей библиотекой VNDK, только если она удовлетворяет следующим критериям:
    • Он не отправляет и не принимает IPC в / из структуры.
    • Это не связано с виртуальной машиной ART.
    • Он не читает / не записывает файлы / разделы с нестабильными форматами файлов.
    • У него нет специальной лицензии на программное обеспечение, требующей юридических проверок.
    • Владелец кода не возражает против использования поставщиками.
  • Рамочные-только библиотеки (FWK-ONLY) являются Рамочными общими библиотеками , которые не относятся к категориям , упомянутыми выше. Эти библиотеки:
    • Рассмотрены детали внутренней реализации фреймворка.
    • Не должны быть доступны модулям поставщика.
    • Иметь нестабильные интерфейсы ABI / API и отсутствие гарантий совместимости с API / ABI.
    • Не копируются.

Однопроцессный HAL (SP-HAL)

Тот же процесс-HAL (SP-HAL) представляет собой набор заранее определенных HALS , реализованные в виде Vendor общих библиотек и загруженных в рамочные процессы. SP-HAL изолированы пространством имен компоновщика (управляет библиотеками и символами, которые видны совместно используемым библиотекам). SP-ГАЛС должен зависеть только от LL-НКА и VNDK-SP.

VNDK-SP - это предопределенное подмножество подходящих библиотек VNDK. Библиотеки VNDK-SP тщательно проверяются, чтобы гарантировать, что двойная загрузка библиотек VNDK-SP в процессы фреймворка не вызовет проблем. И SP-HAL, и VNDK-SP определены Google.

Следующие библиотеки являются утвержденными SP-HAL:

  • libGLESv1_CM_${driver}.so
  • libGLESv2_${driver}.so
  • libGLESv3_${driver}.so
  • libEGL_${driver}.so
  • vulkan.${driver}.so
  • android.hardware.renderscript@1.0-impl.so
  • android.hardware.graphics.mapper@2.0-impl.so

VNDK-SP библиотеки указать vndk: { support_system_process: true } в своих файлах Android.bp. Если vendor_available: false также указано, то эти библиотеки называются VNDK-SP-частного , и они невидимы для SP-ГАЛС.

Ниже рамочные только библиотеки с исключениями RS (FWK-ТОЛЬКО-RS):

  • libft2.so (Renderscript)
  • libmediandk.so (Renderscript)

Терминология ВНДК

  • Модули относятся либо к общим библиотекам или Executables.
  • Процессы операционной системы задач порожден от Executables.
  • Framework -qualified термины относятся к понятиям , связанным с системным разделом.
  • Продавец -qualified термины относятся к понятиям , связанным с перегородками поставщиков.

Например:

  • Framework Исполняемые относятся к исполняемым в /system/bin или /system/xbin .
  • Рамочные общие библиотеки относятся к общим библиотекам при /system/lib[64] .
  • Рамочные модули относятся как Framework разделяемых библиотек и Framework Executables.
  • Рамочные процессы являются процессы , порожденные от Framework Executables (например , /system/bin/app_process ).
  • Продавец Исполняемые относятся к исполняемым в /vendor/bin
  • Производитель общие библиотеки относятся к общим библиотекам под /vendor/lib[64] .
  • Модули поставщиков относятся как поставщик Executables и Vendor общих библиотеки.
  • Производитель Процессы Процессы , порожденные от поставщика Executables (например ,
  • /vendor/bin/android.hardware.camera.provider@2.4-service ).

Управление версиями VNDK

В Android 9 разделяемые библиотеки VNDK версируются:

  • ro.vndk.version свойство системы автоматически добавляется в /vendor/default.prop .
  • VNDK разделяемые библиотеки устанавливаются в /system/lib[64]/vndk-${ro.vndk.version} .
  • VNDK-SP разделяемые библиотеки устанавливаются в /system/lib[64]/vndk-sp-${ro.vndk.version} .
  • Динамический конфигурационный файл линкера устанавливается в /system/etc/ld.config.${ro.vndk.version}.txt .

Значение ro.vndk.version выбирается ниже алгоритму:

  • Если BOARD_VNDK_VERSION не равна current , используйте BOARD_VNDK_VERSION .
  • Если BOARD_VNDK_VERSION равно current :
    • Если PLATFORM_VERSION_CODENAME является REL , использование PLATFORM_SDK_VERSION (например , 28 ).
    • В противном случае, использование PLATFORM_VERSION_CODENAME (например , P ).

Обновление устройств

Если устройство Android 8.x отключено VNDK время выполнения правоприменение, будучи построены без BOARD_VNDK_VERSION , он может добавить PRODUCT_USE_VNDK_OVERRIDE := false в BoardConfig.mk во время обновления до Android 9.

Если PRODUCT_USE_VNDK_OVERRIDE является false , то ro.vndk.lite свойство будет автоматически добавлен в /vendor/default.prop и его значение будет true . Следовательно, динамический компоновщик будет загружать конфигурацию линкер пространства имен из /system/etc/ld.config.vndk_lite.txt , который изолирует только SP-HAL и VNDK-SP.

Для обновления Android 7.0 или более низкое устройство для Android 9, добавить PRODUCT_TREBLE_LINKER_NAMESPACES_OVERRIDE := false в BoardConfig.mk .

Комплект для тестирования поставщиков (VTS)

Android 9 Vendor Test Suite (VTS) мандаты непустое ro.vndk.version собственности. И вновь запускаемые устройства и модернизация устройства должны определить ro.vndk.version . В некоторых случаях тест VNDK (например VtsVndkFilesTest и VtsVndkDependencyTest ) полагаются на ro.vndk.version собственность для загрузки подходящих VNDK библиотеки наборов данных , соответствующих.

Если ro.product.first_api_level свойство больше , чем 27, то ro.vndk.lite не должно быть определено свойство. VtsTreblePlatformVersionTest потерпит неудачу , если ro.vndk.lite определяется в недавно запущенной Android 9 устройства.

История документа

В этом разделе отслеживаются изменения в документации VNDK.

Изменения в Android 9

  • Добавить раздел управления версиями VNDK.
  • Добавить раздел VTS.
  • Некоторые категории VNDK были переименованы:
    • LL-NDK-Indirect был переименован в LL-NDK-Private.
    • VNDK-Indirect был переименован в VNDK-Private.
    • VNDK-SP-Indirect-Private переименован в VNDK-SP-Private.
    • VNDK-SP-Indirect удален.

Изменения в Android 8.1

  • Библиотеки SP-NDK были объединены в библиотеки LL-NDK.
  • Заменить libui.so с libft2.so в RS разделе пространства имен. Это была ошибка , чтобы включить libui.so .
  • Добавить libGLESv3.so и libandroid_net.so библиотек LL-НДК.
  • Добавить libion.so в библиотеки VNDK-SP.
  • Удалить libstdc++.so из библиотек LL-НДК. Используйте libc++.so вместо этого. Некоторые версии автономных компилированных инструментов могут добавлять -lstdc++ для компоновщика флагов по умолчанию. Чтобы отключить по умолчанию, добавьте -nodefaultlibs -lc -lm -ldl в LDFLAGS .
  • Перемещение libz.so из LL-НДК библиотек VNDK-SP. В некоторых конфигурациях libz.so может продолжать быть LL-NDK. Однако заметных различий быть не должно.