Снимок VNDK — это набор ядра VNDK и библиотек 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=user -
TARGET_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 для сборки всех поддерживаемых вариантов Arch с помощью следующей команды.
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-частных библиотек находится в
[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-файла моментального снимка VNDK Arm64 ( TARGET_ARCH=arm64 ) ( android-vndk-arm64.zip ).

Сборка для снимков поставщиков
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/v VER , где VER соответствует версии снимка VNDK (которая соответствует версии SDK соответствующего выпуска Android). Например, снимок Android 8.1 VNDK имеет версию 27.
Используйте скрипт update.py
Скрипт update.py ( /development/vndk/snapshot/update.py ) автоматизирует процесс добавления предварительно созданного снимка VNDK в дерево исходного кода. Он автоматически обнаруживает артефакты сборки и соответствующим образом заполняет связанные свойства в сгенерированном Android.bp . Этот скрипт выполняет следующие задачи:
- В
/prebuilts/vndk/v VERиспользуетсяrepo startдля создания новой ветки Git. - Извлекает и распаковывает артефакты сборки снимков VNDK.
- Запускает
gen_buildfiles.pyдля автоматического создания файлов сборки (Android.bp). - Запускает
check_gpl_license.pyдля проверки наличия исходных кодов готовых библиотек, лицензированных по лицензии General Public License (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
Пример команды для обновления снимка Android 8.1 VNDK с использованием артефактов локальной сборки в /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 имеет доступную версию моментального снимка VNDK в каталоге /prebuilts/vndk , устанавливается моментальный снимок VNDK, указанный в 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.v VER . Отсутствующие версии вызывают ошибку сборки.
Модули 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.v VER ), где 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; до выпуска буквенно-цифровое кодовое имя Android использовалось для PLATFORM_VNDK_VERSION .
Сводка настроек версии VNDK
В таблице приведены настройки версии VNDK.
| Продавец Строить | Доска Версия | SDK Выпускать | Платформа Версия | Версия Свойство | Каталог установки |
|---|---|---|---|---|---|
| Текущие модули ВНДК | current | До | CODE_NAME | CODE_NAME | /system/apex/com.android.vndk.v CODE_NAME |
| После | SDK_VER | SDK_VER | /system/apex/com.android.vndk.v SDK_VER | ||
| Готовые модули моментальных снимков | VNDK_VERдля снимка | До или После | CODE_NAMEили SDK_VER | VNDK_VER | /system_ext/apex/com.android.vndk.v VNDK_VER |
- Версия платы (
BOARD_VNDK_VERSION). Версия VNDK, необходимая для сборки модулей поставщика. Установите значениеcurrent, если модули поставщика могут связываться с текущими системными модулями. - Версия платформы (
PLATFORM_VNDK_VERSION). Версия VNDK, которую создают текущие системные модули. Создается только тогда, когдаBOARD_VNDK_VERSIONравен текущему. - Свойство версии (
ro.vndk.version). Свойство, указывающее версию VNDK, которую необходимо запускать двоичным файлам и библиотекам в файлеvendor.img. Хранится вvendor.imgпо адресу/vendor/default.prop.