Дизайн снимков VNDK

Снимки VNDK могут использоваться образом системы для предоставления правильных библиотек VNDK образам поставщиков, даже если образы системы и поставщика созданы на основе разных версий Android. Для создания моментального снимка VNDK необходимо захватить библиотеки VNDK в виде моментального снимка и пометить их номером версии. Образ поставщика может быть связан с определенной версией VNDK, которая предоставляет необходимые ABI для модулей в образе поставщика. Однако в пределах одной и той же версии VNDK библиотеки VNDK должны быть ABI-стабильными .

Дизайн моментального снимка VNDK включает методы создания предварительных сборок моментального снимка VNDK из текущего образа системы и установки этих предварительно созданных библиотек в системный раздел более новой версии Android.

О библиотеках ВНДК

HIDL-HAL , представленный в Android 8.0, позволяет выполнять отдельные обновления для системного раздела и раздела поставщика. VNDK определяет наборы библиотек (VNDK-core, VNDK-SP и LL-NDK), с которыми может связываться код поставщика, и запрещает поставщикам использовать библиотеки, которых нет в наборе VNDK. В результате образ поставщика может быть создан и запущен, если ему предоставлены соответствующие наборы VNDK для образа системы.

ВНДК-ядро

Набор библиотек ядра VNDK устанавливается в /system/lib[64]/vndk-${VER} и доступен только для процессов поставщика с уровнем API, равным ${VER} . Системные процессы не могут использовать эти библиотеки и вместо этого должны использовать библиотеки, установленные в /system/lib[64] . Из-за строгого ограничения пространства имен для каждого процесса библиотеки ядра VNDK защищены от двойной загрузки.

Чтобы включить библиотеку в ядро ​​VNDK, добавьте в Android.bp следующее:

vendor_available: true,
vndk: {
    enabled: true,
},

ВНДК-СП

Библиотеки VNDK-SP устанавливаются в /system/lib[64]/vndk-sp-${VER} и доступны процессам поставщика и системным процессам (через библиотеки SP-HAL, установленные в разделе поставщика). Библиотеки ВНДК-СП могут иметь двойную загрузку.

Чтобы включить библиотеку в VNDK-SP, добавьте в Android.bp следующее:

vendor_available: true,
vndk: {
    enabled: true,
    support_system_process: true,
},

ЛЛ-НДК

Библиотеки LL-NDK устанавливаются в /system/lib[64] . Модули поставщиков могут использовать библиотеки-заглушки LL-NDK для доступа к предварительно выбранным символам библиотек LL-NDK. Библиотеки LL-NDK должны быть обратно совместимыми и ABI-стабильными, чтобы старые версии модулей поставщиков могли использовать новые версии библиотек LL-NDK. Благодаря ABI-стабильным характеристикам LL-NDK моментальный снимок VNDK не требует включения библиотек LL-NDK для образов старых поставщиков.

О снапшотах VNDK

В состав Android 8.1 вошли библиотеки VNDK, созданные из исходного кода . Однако для более поздних версий Android каждая версия VNDK должна быть сохранена в виде моментального снимка и предоставлена ​​в качестве предварительной сборки, чтобы обеспечить возможность связывания с более старым образом поставщика.

Начиная с Android 9, новые версии Android будут включать в себя как минимум один снимок каталогов VNDK-core и VNDK-SP для более старых версий в исходном коде Android. Во время сборки необходимые снимки будут установлены в /system/lib[64]/vndk-${VER} и /system/lib[64]/vndk-sp-${VER} (каталоги, которые может использовать поставщик). раздел), где ${VER} — строковая переменная, представляющая имя версии моментального снимка VNDK.

Поскольку библиотеки снимков VNDK могут отличаться для каждой версии VNDK, снимок VNDK также включает конфигурации пространства имен компоновщика, установленные как etc/ld.config.${VER}.txt , /etc/llndk.libraries.${VER}.txt и /etc/vndksp.libraries.${VER}.txt .

Пример: Обновление образов системы и поставщиков

Снимок не требуется; сборка без дополнительных настроек для снимков VNDK.

Пример: Обновление только образа системы

В образ системы необходимо включить моментальный снимок VNDK и файлы конфигурации пространства имен компоновщика для образа поставщика. Файлы конфигурации пространства имен компоновщика автоматически настраиваются для поиска библиотек VNDK в /system/lib[64]/vndk-${VER} и /system/lib[64]/vndk-sp-${VER} .

Рисунок 1. Только обновление системы

Пример: обновление образа системы, незначительное изменение образа поставщика.

Создание образа поставщика на основе моментального снимка VNDK пока не поддерживается, поэтому необходимо создать образ поставщика отдельно с исходным исходным кодом, а затем обновить образ системы, как описано в предыдущем примере.

Архитектура моментального снимка VNDK

Чтобы сделать образ системы Android 9 совместимым с образом поставщика Android 8.1, снимок VNDK, соответствующий образу поставщика Android 8.1, должен быть предоставлен вместе с образом системы Android 9, как показано ниже:

Рисунок 2. Архитектура снимка VNDK

Проектирование моментального снимка VNDK включает в себя следующие методы:

  • Генерация снапшота для библиотек VNDK-core и VNDK-SP . Android 9 включает скрипт, который можно использовать для создания моментального снимка текущей сборки VNDK. Этот сценарий объединяет все библиотеки в /system/lib[64]/vndk-28 и /system/lib[64]/vndk-sp-28 которые были собраны с текущим исходным кодом в виде снимка VNDK, где 28 — это версия VNDK. Android 9. Снимок также включает файлы конфигурации пространства имен компоновщика /etc/ld.config.28.txt , /etc/llndk.libraries.28.txt и /etc/vndksp.libraries.28.txt . Сгенерированный снимок будет использоваться с более новыми версиями Android (более поздними, чем Android 9).
  • Установка готовых библиотек VNDK-core и VNDK-SP из снапшота . В Android 9 моментальный снимок VNDK содержит набор предварительно созданных библиотек ядра VNDK и набор библиотек VNDK-SP, а также файлы конфигурации пространства имен компоновщика. Когда вы предоставляете список версий моментальных снимков VNDK, которые необходимо установить, во время сборки образ системы устанавливает библиотеки моментальных снимков VNDK в /system/lib[64]/vndk-${VER} и /system/lib[64]/vndk-sp-${VER} и файлы конфигурации пространства имен компоновщика для этих снимков VNDK в каталог /etc .

Управление версиями ВНДК

В каждом выпуске Android имеется только один снимок VNDK, и версия SDK используется как версия VNDK (это означает, что версия VNDK имеет целое число, например 27 для Android 8.1). Версия VNDK исправляется при выпуске версии Android. Версия VNDK, используемая разделом поставщика, автоматически сохраняется в свойстве ro.vndk.version , которое можно прочитать во время выполнения. Эта версия затем используется для определения версии VNDK поставщика для некоторых библиотек и определения версии моментального снимка VNDK для конфигурации пространства имен.

Создание библиотек VNDK

Команда make vndk создает библиотеки с vndk: { enabled: true, … } , включая зависимости и файлы конфигурации пространства имен. Если установлен BOARD_VNDK_VERSION := current , эти библиотеки собираются с помощью команды make .

Поскольку эта сборка не устанавливает библиотеки VNDK из моментального снимка, установленные библиотеки VNDK не являются ABI-стабильными. Однако при выпуске версии Android ABI для текущей версии VNDK фиксируется. На этом этапе любая поломка ABI является ошибкой сборки, поэтому исправления для версии Android не должны изменять ABI для библиотек VNDK.