生成 VNDK 快照

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

VNDK 快照是 Android 版本的一组 VNDK 核心和 VNDK-SP 库。如果system.img包含vendor.img所需的相应 VNDK 快照,则您只能升级系统分区。

官方 VNDK 快照在 Android 构建服务器上自动构建,并签入 Android 源代码树的/prebuilts/vndk中。出于开发目的,您可以在本地构建 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)目标架构armarm64x86x86_64 )相同。
  • TARGET_ARCH_VARIANT 。对于快照 v28 (Android 9) 及更高版本,包括上面列出的流行配置。

构建命令

对于官方快照,Android 9 及更高版本在vndk.mk中包含一个示例目标 ( vndk ),用于构建 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

Android 版本的 VNDK 快照是从该版本的发布分支生成的。

本地构建

在开发过程中,您可以使用以下命令从本地源代码树构建 VNDK 快照。

  • 要一次构建所有受支持的架构,请执行以下构建脚本 ( build.sh )。
    cd $ANDROID_BUILD_TOP
    development/vndk/snapshot/build.sh
    
  • 要构建一个特定的TARGET_ARCH ,请执行以下命令。
    lunch aosp_TARGET_ARCH-user
    m -j vndk dist
    

$DIST_DIR下创建相应的android-vndk-$(TARGET_ARCH).zip文件。

快照文件

VNDK 快照包括以下文件。

  • VNDK-core 和 VNDK-SP 共享库的供应商变体。
    • 不需要 LL-NDK 共享库,因为它们向后兼容。
    • 对于 64 位目标,构建并包含TARGET_ARCHTARGET_2ND_ARCH库。
  • VNDK-core、VNDK-SP、LL-NDK 和 VNDK-private 库列表位于[vndkcore|vndksp|llndk|vndkprivate].libraries.txt
  • 许可证文件。
  • module_paths.txt 。记录所有 VNDK 库的模块路径,这是检查 GPL 项目是否具有在给定 Android 源代码树中发布的源代码所必需的。

对于给定的 VNDK 快照 ZIP 文件android-vndk-$(TARGET_ARCH).zip ,VNDK 预构建库根据 ABI 位数分组在名为arch-$(TARGET_ARCH)-$(TARGET_ARCH_VARIANT)单独目录中。例如,对于android-vndk-arm64.zip ,64 位库位于arch-arm64-armv8-a下,32 位库位于arch-arm-armv8-a下。下面的示例显示了 arm64 ( TARGET_ARCH=arm64 ) VNDK 快照 ZIP 文件 ( 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

此命令在$DIST_DIR下创建android-vndk-$(TARGET_ARCH).zip文件。下面的示例是一个带有构建工件的 arm64 VNDK 快照 ZIP 文件。粗体文件是新添加到普通 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 快照的版本(遵循相应 Android 版本的 SDK 版本)。例如,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以验证根据通用公共许可证 (GPL) 许可的预构建库是否在当前源代码树中发布了源代码。
  5. 使用git commit提交新的更改。

使用本地构建的 VNDK 快照

您还可以使用本地构建的 VNDK 快照。当指定--local选项时, update.py脚本从指定的本地目录(而不是 Android 构建服务器)获取 VNDK 快照构建工件,该目录具有从development/vndk/snapshot/build.sh生成的android-vndk-$(TARGET_ARCH).zip文件development/vndk/snapshot/build.sh 。使用--local选项, update.py脚本会跳过 GPL 许可检查和git commit步骤。

句法:

python update.py VER --local local_path

使用/path/to/local/dir中的本地构建工件更新 Android 8.1 VNDK 快照的示例命令:

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 快照

系统映像在构建时使用BOARD_VNDK_VERSIONPRODUCT_EXTRA_VNDK_VERSIONSro.vndk.version中的信息安装 VNDK 快照库。您可以使用以下选项之一控制从预构建的 VNDK 快照目录(例如/prebuilts/vndk/v29/prebuilts/vndk/v30 )安装哪些 VNDK 快照。

  • 选项 1: BOARD_VNDK_VERSION 。使用快照模块构建当前的供应商模块,并仅安装供应商模块所需的快照模块。
  • 选项 2: PRODUCT_EXTRA_VNDK_VERSIONS 。无论当前的供应商模块如何,都安装 VNDK 快照模块。这将安装PRODUCT_EXTRA_VNDK_VERSIONS中列出的预构建 VNDK 快照,而不会在构建时将它们链接到任何其他模块。

设置 BOARD_VNDK_VERSION

BOARD_VNDK_VERSION显示当前供应商模块需要构建的 VNDK 版本。如果BOARD_VNDK_VERSION/prebuilts/vndk目录中有可用的 VNDK 快照版本,则安装BOARD_VNDK_VERSION中指示的 VNDK 快照。如果 VNDK 快照在目录中不可用,则会发生构建错误。

定义BOARD_VNDK_VERSION还可以安装 VNDK 模块。供应商模块在构建时与BOARD_VNDK_VERSION中定义的 VNDK 快照版本链接(这不会在系统源代码中构建当前 VNDK 模块)。从存储库下载完整的源代码树时,系统和供应商源都基于相同的 Android 版本。

设置 PRODUCT_EXTRA_VNDK_VERSIONS

PRODUCT_EXTRA_VNDK_VERSIONS列出要安装的额外 VNDK 版本。通常,当前供应商分区有一个 VNDK 快照就足够了。但是,在某些情况下,您可能需要在一个系统映像中包含多个快照。例如,GSI 具有多个快照以支持具有一个系统映像的多个供应商版本。通过设置PRODUCT_EXTRA_VNDK_VERSIONS ,除了BOARD_VNDK_VERSION中的 VNDK 版本之外,您还可以安装 VNDK 快照模块。

如果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设置为Android发布时的SDK版本;在发布之前,字母数字 Android 代号用于PLATFORM_VNDK_VERSION

VNDK 版本设置总结

下表总结了 VNDK 版本设置。

小贩
建造
木板
版本
开发工具包
发布
平台
版本
版本
财产
安装目录
当前的 VNDK 模块currentCODE_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 )。指定 vendor.img 中的二进制文件和库运行所需的 VNDK 版本的属性。存储在/vendor/default.propvendor.img中。