VNDK 快照是一组用于 Android 版本的 VNDK-core 和 VNDK-SP 库。
如果 system.img
包含 vendor.img
所需的相应 VNDK 快照,您只能升级 system 分区。
正式的 VNDK 快照是在 Android 构建服务器上自动构建而成的,并签入 Android 源代码树的 /prebuilts/vndk
中。为了便于开发,您可以在本地构建 VNDK 快照。arm、arm64、x86 和 x86_64 TARGET_ARCH
类型支持 VNDK 快照。
构建快照
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
,系统会根据 ABI 位数将 VNDK 预构建库分组到名为 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 快照目录结构](https://source.android.google.cn/static/docs/core/architecture/images/vndk_snapshot_directory.png?authuser=9&hl=da)
针对供应商快照的构建
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/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
后,除了 BOARD_VNDK_VERSION
中的 VNDK 版本之外,您还可以安装 VNDK 快照模块。
如果 PRODUCT_EXTRA_VNDK_VERSIONS
具有特定的版本列表,构建系统会在 prebuilts/vndk
目录中查找版本列表的预构建快照。如果构建系统找到所有列出的快照,便会将这些快照文件安装到每个 VNDK APEX (out/target/product/$(TARGET_DEVICE)/system_ext/apex/com.android.vndk.vVER
) 中。如果缺少版本,则会生成构建错误。
VNDK 模块在构建时不与供应商模块相关联,但在运行时可以使用,前提是 vendor 分区中的供应商模块需要某个已安装的 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 版本设置。
供应商 Build |
开发板 版本 |
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
为当前版本时进行构建。 - 版本属性 (
ro.vndk.version
):一种属性,用于指定 vendor.img 中的二进制文件和库需要运行的 VNDK 版本。存储在/vendor/default.prop
的vendor.img
中。