Создание снимков VNDK

Снимок 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=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-user
make -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_TOP
    development/vndk/snapshot/build.sh
  • Чтобы создать определенный TARGET_ARCH, выполните следующие команды:
    lunch aosp_TARGET_ARCH-user
    m -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).

Структура каталогов снимков VNDK
Рисунок 1. Структура каталогов снимка VNDK (пример)

Сборка для снимков поставщика

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. Этот скрипт выполняет следующие задачи:

  1. В /prebuilts/vndk/vVER используется repo start для создания новой ветки Git.
  2. Извлекает и распаковывает артефакты сборки снимка VNDK.
  3. Выполняет команду gen_buildfiles.py, чтобы автоматически создать файлы сборки (Android.bp).
  4. Выполняет команду check_gpl_license.py, чтобы проверить, есть ли в текущем дереве исходного кода источники встроенных библиотек, лицензированных по GPL.
  5. Использует 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.