Образ системы может использовать снимки VNDK, чтобы предоставлять правильные библиотеки VNDK образам поставщиков, даже если образы системы и поставщиков созданы на основе разных версий Android. Чтобы создать снимок VNDK, необходимо сделать снимок библиотек VNDK и присвоить ему номер версии. Изображение поставщика может быть связано с определенной версией VNDK, которая предоставляет необходимые ABI для модулей в изображении поставщика. Однако в рамках одной версии VNDK библиотеки VNDK должны быть стабильными на уровне ABI.
В архитектуре VNDK snapshot предусмотрены методы для создания предварительных сборок VNDK snapshot из текущего образа системы и установки этих предварительно собранных библиотек в системный раздел более новой версии Android.
О библиотеках VNDK
HIDL-HAL, представленные в Android 8.0, позволяют обновлять системный и пользовательский разделы по отдельности. VNDK определяет наборы библиотек (VNDK-core, VNDK-SP и LL-NDK), с которыми может связываться код поставщика, и блокирует использование библиотек, не входящих в набор VNDK. В результате образ поставщика можно создать и запустить, если в образе системы есть подходящие наборы VNDK, которые передаются в образ поставщика.
VNDK-core
Набор библиотек VNDK-core устанавливается в /system/lib[64]/vndk-${VER} и доступен только для процессов поставщика с уровнем API, равным ${VER}. Системные процессы не могут использовать эти библиотеки и должны вместо этого использовать библиотеки, установленные в /system/lib[64]. Из-за строгих ограничений на пространство имен для каждого процесса библиотеки VNDK-core защищены от двойной загрузки.
Чтобы включить библиотеку в VNDK-core, добавьте в файл Android.bp следующие строки:
vendor_available: true,
vndk: {
enabled: true,
},VNDK-SP
Библиотеки 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
Библиотеки 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}.
Пример: обновление образа системы, незначительное изменение образа поставщика.
Создание образа поставщика на основе снимка VNDK пока не поддерживается, поэтому образ поставщика необходимо создавать отдельно с помощью исходного кода, а затем обновить образ системы, как описано в предыдущем примере.
Архитектура снимка VNDK
Чтобы сделать образ системы Android 9 совместимым с образом поставщика Android 8.1, необходимо предоставить снимок VNDK, соответствующий образу поставщика Android 8.1, вместе с образом системы Android 9, как показано ниже:
В дизайн снимка 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-core и VNDK-SP, а также файлы конфигурации пространства имен компоновщика. Когда вы указываете список версий VNDK snapshot, которые нужно установить, во время сборки образ системы устанавливает библиотеки VNDK snapshot в каталоги
/system/lib[64]/vndk-${VER}и/system/lib[64]/vndk-sp-${VER}, а файлы конфигурации пространства имен компоновщика для этих VNDK snapshot – в каталог/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.