Генерация моментальных снимков 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 совпадает с целевыми арками Generic System Image (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-файла моментального снимка VNDK arm64 ( TARGET_ARCH=arm64 ) ( android-vndk-arm64.zip ).

Структура каталога моментальных снимков 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/v VER , где VER равен версии моментального снимка VNDK (которая следует за версией SDK соответствующего выпуска Android). Например, снимок состояния Android 8.1 VNDK имеет версию 27.

Использование скрипта update.py

Сценарий update.py ( /development/vndk/snapshot/update.py ) автоматизирует процесс добавления предварительно созданного моментального снимка VNDK в исходное дерево. Он автоматически обнаруживает артефакты сборки и соответствующим образом заполняет связанные свойства в сгенерированном Android.bp . Этот скрипт выполняет следующие задачи:

  1. В /prebuilts/vndk/v VER использует repo start репозитория для создания новой ветки Git.
  2. Извлекает и распаковывает артефакты сборки моментальных снимков VNDK.
  3. Запускает gen_buildfiles.py для автоматического создания файлов сборки ( Android.bp ).
  4. Запускает check_gpl_license.py , чтобы проверить исходные коды готовых библиотек под лицензией General Public License (GPL), выпущенные в текущем дереве исходных текстов.
  5. Использует git commit для фиксации новых изменений.

Использование локально созданных моментальных снимков VNDK

Вы также можете использовать локально созданные моментальные снимки VNDK. Если указан параметр --local , сценарий update.py извлекает артефакты сборки моментальных снимков VNDK из локального $DIST_DIR (вместо сервера сборки Android) и пропускает этапы проверки лицензии GPL и git commit . Чтобы установить локально созданный моментальный снимок VNDK, перейдите в целевой каталог и используйте сценарий update.py .

Синтаксис:

python update.py VER --local

Пример команды для обновления моментального снимка VNDK Android 8.1 с помощью локальных артефактов сборки:

python update.py 27 --local

Пример структуры каталогов локально созданного моментального снимка 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 .

ПЛАТФОРМА_VNDK_ВЕРСИЯ

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 .