Дизайн снимков 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-ядро

Набор библиотек VNDK-core установлен в /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 могут загружаться дважды.

Чтобы включить библиотеку в 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. Из-за стабильных характеристик LL-NDK для ABI моментальный снимок 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 включает следующие методы:

  • Генерация снапшота для библиотек ВНДК-ядро и ВНДК-СП . В 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 .

Версии VNDK

Каждый выпуск 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.