Снимок VNDK – это набор библиотек VNDK-core и VNDK-SP для определенной версии Android.
Обновить можно только системный раздел, если system.img содержит соответствующий моментальный снимок VNDK, необходимый для vendor.img.
Официальные снимки VNDK создаются автоматически на сервере сборки Android и сохраняются в /prebuilts/vndk дерева исходного кода Android. Для целей разработки вы можете создавать снимки VNDK локально. Снимки VNDK поддерживаются для вариантов arm, arm64, x86 и x86_64 TARGET_ARCH.
Создание снимков
Сервер сборки Android создает артефакты сборки и файлы снимков VNDK, используя следующие параметры и команды сборки.
Как создавать параметры
Название целевой сборки: vndk. Ниже показана конфигурация целевой сборки.
TARGET_PRODUCT |
TARGET_ARCH |
TARGET_ARCH_VARIANT |
|---|---|---|
aosp_arm |
arm |
armv7-a-neon |
aosp_arm64 |
arm64 |
armv8-a |
aosp_x86 |
x86 |
x86 |
aosp_x86_64 |
x86_64 |
x86_64 |
TARGET_PRODUCT=aosp_$(TARGET_ARCH)TARGET_BUILD_VARIANT=userTARGET_ARCH– то же, что и образ системы общего назначения (GSI). Целевые архитектуры (arm,arm64,x86,x86_64).TARGET_ARCH_VARIANT. Для версии 28 (Android 9) и более поздних версий в него входят популярные конфигурации, перечисленные выше.
Как создавать команды
В официальных снимках для Android 9 и более поздних версий есть целевой объект (vndk) в vndk.mk, который создает и выводит снимок VNDK в $DIST_DIR. ZIP-файл со снимком имеет формат android-vndk-$(TARGET_ARCH).zip.
Пример:
lunch aosp_TARGET_ARCH-usermake -j vndk dist [BOARD_VNDK_VERSION=current]
Сервер сборки Android использует скрипт build.sh для сборки всех поддерживаемых вариантов архитектуры с помощью следующей команды.
DIST_DIR=dist_dir development/vndk/snapshot/build.sh
Снимок VNDK для версии Android создается из ветви выпуска этой версии.
Локальная сборка
Во время разработки вы можете создавать снимки VNDK из локального дерева исходного кода с помощью следующих команд.
- Чтобы создать все поддерживаемые архитектуры одновременно, выполните следующий скрипт сборки (
build.sh).cd $ANDROID_BUILD_TOPdevelopment/vndk/snapshot/build.sh - Чтобы создать определенный
TARGET_ARCH, выполните следующие команды:lunch aosp_TARGET_ARCH-userm -j vndk dist
Соответствующий файл android-vndk-$(TARGET_ARCH).zip будет создан в папке $DIST_DIR.
Файлы снимков
Снимок VNDK включает следующие файлы:
- Вариант поставщика общих библиотек VNDK-core и VNDK-SP.
- Общие библиотеки LL-NDK не нужны, поскольку они обратно совместимы.
- Для 64-битных целевых платформ создаются и включаются библиотеки
TARGET_ARCHиTARGET_2ND_ARCH.
- Список библиотек VNDK-core, VNDK-SP, LL-NDK и VNDK-private находится в файле
[vndkcore|vndksp|llndk|vndkprivate].libraries.txt. - Лицензировать файлы.
module_paths.txt. Записывает пути к модулям для всех библиотек VNDK, что необходимо для проверки того, что проекты GPL имеют источники, выпущенные в определенном дереве исходного кода Android.
Для определенного ZIP-файла снимка VNDK, android-vndk-$(TARGET_ARCH).zip, предварительно созданные библиотеки VNDK группируются в отдельные каталоги с названиями arch-$(TARGET_ARCH)-$(TARGET_ARCH_VARIANT) в соответствии с разрядностью ABI. Например, для android-vndk-arm64.zip 64-битные библиотеки размещаются в папке arch-arm64-armv8-a, а 32-битные – в папке arch-arm-armv8-a. Ниже показана структура каталогов для ZIP-файла (android-vndk-arm64.zip) со снимком VNDK для arm64 (TARGET_ARCH=arm64).
Сборка для снимков поставщика
Android 11 поддерживает снимки поставщика, которые позволяют создавать vendor.img независимо от версии Android в дереве исходного кода. Снимок VNDK по умолчанию содержит файлы общих библиотек (.so), которые можно установить на устройства и затем связать с двоичными файлами C++ поставщика во время выполнения. Чтобы выполнить сборку на основе этого снимка VNDK, вам понадобятся дополнительные артефакты, такие как заголовочные файлы и экспортированные флаги.
Чтобы сгенерировать такие артефакты (вместе со снимком VNDK) из локального дерева источников, используйте следующую команду.
VNDK_SNAPSHOT_BUILD_ARTIFACTS=true development/vndk/snapshot/build.sh
Эта команда создаст файлы android-vndk-$(TARGET_ARCH).zip в каталоге $DIST_DIR. Ниже приведен пример ZIP-файла со снимком VNDK для архитектуры arm64 и артефактами сборки. Выделенные жирным шрифтом файлы были добавлены в обычный снимок VNDK (показан на рисунке 1) и включают файлы JSON (в которых хранится cflags каждой библиотеки) и все экспортированные заголовочные файлы.
android-vndk-arm64.zip ├── arch-arm64-armv8-a │ └── shared │ ├── vndk-core -> *.so files, *.json files │ └── vndk-sp -> *.so files, *.json files ├── arch-arm-armv8-a -> (same as arch-arm64-armv8-a) ├── configs -> *.libraries.txt, module_paths.txt, module_names.txt ├── include -> exported header files (*.h, *.hh, etc.) └── NOTICE_FILES -> license txt files
Загрузка снимков VNDK
Снапшоты VNDK проверяются в дереве исходного кода в каталоге /prebuilts/vndk/vVER, где VER – версия снапшота VNDK (соответствует версии SDK для выпуска Android). Например, у снимка VNDK для Android 8.1 будет версия 27.
Используйте скрипт update.py
Скрипт update.py (/development/vndk/snapshot/update.py) автоматизирует процесс добавления предварительно созданного снимка VNDK в дерево исходного кода. Он автоматически обнаруживает артефакты сборки и заполняет связанные свойства в сгенерированном файле Android.bp. Этот скрипт выполняет следующие задачи:
- В
/prebuilts/vndk/vVERиспользуетсяrepo startдля создания новой ветки Git. - Извлекает и распаковывает артефакты сборки снимка VNDK.
- Выполняет команду
gen_buildfiles.py, чтобы автоматически создать файлы сборки (Android.bp). - Выполняет команду
check_gpl_license.py, чтобы проверить, есть ли в текущем дереве исходного кода источники встроенных библиотек, лицензированных по GPL. - Использует
git commitдля сохранения изменений.
Как использовать локально созданные снимки VNDK
Также можно использовать локально созданные снимки VNDK. Если указан параметр --local, скрипт update.py получает артефакты сборки VNDK из указанного локального каталога (а не с сервера сборки Android), в котором есть файлы android-vndk-$(TARGET_ARCH).zip, сгенерированные из development/vndk/snapshot/build.sh. При использовании варианта --local скрипт update.py пропускает проверку лицензии GPL и шаги git commit.
Синтаксис
python update.py VER --local local_path
Пример команды для обновления VNDK-снимка Android 8.1 с помощью локальных артефактов сборки в /path/to/local/dir:
python update.py 27 --local /path/to/local/dir
Пример структуры каталогов локально созданного снимка VNDK:
prebuilts/vndk ├── v30 │ ├── arm64 │ │ ├── arch-arm64-armv8-a -> (prebuilt libs) │ │ ├── arch-arm-armv8-a -> (prebuilt libs) │ │ ├── configs -> (config files) │ │ ├── include -> (exported header files) │ │ └── Android.bp -> (VNDK modules with cflags) │ ├── arm -> (same as above) │ ├── x86_64 -> (same as above) │ ├── x86 -> (same as above) │ ├── common │ │ ├── NOTICE_FILES -> (license files) │ │ └── Android.bp -> (license file modules) │ └── Android.bp -> (*.libraries.30.txt modules) └── (other VNDK versions) -> (same as above)
VNDK_SNAPSHOT_BUILD_ARTIFACTS=true.
Установка снимков VNDK
Образ системы устанавливает библиотеки снимков VNDK во время сборки, используя информацию из файлов BOARD_VNDK_VERSION, PRODUCT_EXTRA_VNDK_VERSIONS и ro.vndk.version.
Вы можете указать, какие снимки VNDK будут установлены из предварительно созданных каталогов снимков VNDK (например, /prebuilts/vndk/v29 или /prebuilts/vndk/v30), одним из следующих способов:
- Вариант 1
BOARD_VNDK_VERSION. Используйте модули моментальных снимков для создания текущих модулей поставщика и устанавливайте только те модули моментальных снимков, которые необходимы для модулей поставщика. - Вариант 2.
PRODUCT_EXTRA_VNDK_VERSIONS. Устанавливать модули моментального снимка VNDK независимо от текущих модулей поставщика. Это позволяет установить предварительно созданные снимки VNDK, перечисленные в файлеPRODUCT_EXTRA_VNDK_VERSIONS, не связывая их с другими модулями во время сборки.
Как задать значение BOARD_VNDK_VERSION
BOARD_VNDK_VERSION показывает версию VNDK, которая требуется для сборки текущих модулей поставщика. Если BOARD_VNDK_VERSION в каталоге /prebuilts/vndk есть доступная
версия VNDK snapshot, указанная в BOARD_VNDK_VERSION, то устанавливается
именно она. Если в каталоге нет снимка VNDK, возникнет ошибка сборки.
Определение BOARD_VNDK_VERSION также позволяет устанавливать модули VNDK. Модули поставщика связываются с версией снимка VNDK, определенной в BOARD_VNDK_VERSION во время сборки (при этом не выполняется сборка текущих модулей VNDK в системном источнике). При скачивании полного дерева исходного кода из репозитория системные и сторонние источники основаны на одном и том же выпуске Android.
Задайте PRODUCT_EXTRA_VNDK_VERSIONS
PRODUCT_EXTRA_VNDK_VERSIONS содержит список дополнительных версий VNDK, которые нужно установить. Обычно достаточно одного снимка VNDK для текущего раздела поставщика. Однако в некоторых случаях вам может понадобиться включить в один образ системы несколько снимков. Например, в GSI есть несколько снимков, чтобы поддерживать разные версии поставщиков с одним образом системы. Установив значение PRODUCT_EXTRA_VNDK_VERSIONS, вы сможете установить модули моментального снимка VNDK в дополнение к версии VNDK в BOARD_VNDK_VERSION.
Если у PRODUCT_EXTRA_VNDK_VERSIONS есть определенный список версий, система сборки ищет предварительно созданные снимки списка версий в каталоге prebuilts/vndk. Если система сборки находит все перечисленные снимки, она устанавливает их файлы в каждый VNDK APEX (out/target/product/$(TARGET_DEVICE)/system_ext/apex/com.android.vndk.vVER). Отсутствующие версии приводят к ошибке сборки.
Модули VNDK не связываются с модулями поставщика во время сборки, но могут использоваться во время выполнения, если модулям поставщика в разделе поставщика требуется одна из установленных версий VNDK. PRODUCT_EXTRA_VNDK_VERSIONS действительно, только если определено BOARD_VNDK_VERSION.
PLATFORM_VNDK_VERSION
PLATFORM_VNDK_VERSION определяет версию VNDK для текущих модулей VNDK в исходном коде системы. Значение устанавливается автоматически:
- До выпуска значение
PLATFORM_VNDK_VERSIONбудет установлено какPLATFORM_VERSION_CODENAME. - При выпуске
PLATFORM_SDK_VERSIONкопируется вPLATFORM_VNDK_VERSION.
После выпуска версии Android текущие библиотеки VNDK устанавливаются в VNDK APEX (/system/apex/com.android.vndk.vVER), где VER – это версия, хранящаяся в PLATFORM_VNDK_VERSION.
Если для параметра BOARD_VNDK_VERSION задано значение current, то PLATFORM_VNDK_VERSION сохраняется в ro.vndk.version. В противном случае BOARD_VNDK_VERSION сохраняется в ro.vndk.version. PLATFORM_VNDK_VERSION задается как версия SDK при выпуске Android. До этого для PLATFORM_VNDK_VERSION используется буквенно-цифровое кодовое название Android.
Сводка настроек версии VNDK
В таблице приведены настройки версий VNDK.
| Vendor Build |
Плата Версия |
SDK Release |
Платформа Версия |
Version Property |
Каталог установки |
|---|---|---|---|---|---|
| Текущие модули VNDK | current |
До | CODE_NAME |
CODE_NAME |
/system/apex/com.android.vndk.vCODE_NAME |
| После | SDK_VER |
SDK_VER |
/system/apex/com.android.vndk.vSDK_VER |
||
| Готовые модули сводки | VNDK_VERдля снимка |
До или после | CODE_NAMEили SDK_VER |
VNDK_VER |
/system_ext/apex/com.android.vndk.vVNDK_VER |
- Версия платы (
BOARD_VNDK_VERSION). Версия VNDK, необходимая для сборки модулей поставщика. Установите значениеcurrent, если модули поставщика могут быть связаны с текущими системными модулями. - Версия платформы (
PLATFORM_VNDK_VERSION). Версия VNDK, на основе которой создаются текущие системные модули. Создается, только еслиBOARD_VNDK_VERSIONравно current. - Свойство версии (
ro.vndk.version). Свойство, в котором указана версия VNDK, необходимая для запуска двоичных файлов и библиотек в vendor.img. Хранится вvendor.imgпо адресу/vendor/default.prop.