VNDK 快照是 Android 版本的一组 VNDK-core 和 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) 目标架构(arm
、arm64
、x86
、x86_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
相应的 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 源代码树中发布了源代码是必需的。
对于给定的 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
) 的目录结构。

为供应商快照构建
Android 11 支持供应商快照,这使您能够构建 vendor.img
,而无需考虑源代码树上的 Android 版本。默认 VNDK 快照包含可以安装到设备并在运行时从供应商 C++ 二进制文件链接的共享库文件 (.so
)。要*针对*该 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/vVER
下,其中 VER
等于 VNDK 快照的版本(遵循相应 Android 版本的 SDK 版本)。例如,Android 8.1 VNDK 快照的版本为 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
脚本从指定的本地目录(而不是 Android 构建服务器)获取 VNDK 快照构建工件,该目录具有从 development/vndk/snapshot/build.sh
生成的 android-vndk-$(TARGET_ARCH).zip
文件。使用 --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_VERSION
、PRODUCT_EXTRA_VNDK_VERSIONS
和 ro.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
,您可以安装 VNDK 快照模块,以及 BOARD_VNDK_VERSION
中的 VNDK 版本。
如果 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
在 Android 发布时设置为 SDK 版本;在发布之前,字母数字 Android 代码名称用于 PLATFORM_VNDK_VERSION
。
VNDK 版本设置摘要
该表总结了 VNDK 版本设置。
供应商 构建 |
板 版本 |
SDK 发布 |
平台 版本 |
版本 属性 |
安装目录 |
---|---|---|---|---|---|
当前 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
)。指定 vendor.img 中的二进制文件和库运行所需的 VNDK 版本的属性。存储在vendor.img
的/vendor/default.prop
中。