即使系统映像和供应商映像是使用不同版本的 Android 构建的,系统映像也可以使用 VNDK 快照向供应商映像提供正确的 VNDK 库。创建 VNDK 快照需要将 VNDK 库捕获为快照并使用版本号标记它们。供应商映像可以与提供供应商映像中模块所需 ABI 的特定 VNDK 版本链接。但是,在同一 VNDK 版本中,VNDK 库必须是 ABI 稳定的。
VNDK 快照设计包括以下方法:从当前系统映像生成 VNDK 快照的预构建版本以及将这些预构建库安装到较新 Android 版本的系统分区。
关于 VNDK 库
HIDL-HAL 在 Android 8.0 中引入,支持系统分区和供应商分区单独升级。VNDK 定义了供应商代码可以链接的库集(VNDK-core、VNDK-SP 和 LL-NDK),并阻止供应商使用不在 VNDK 集中的库。因此,如果系统映像上提供了适当的 VNDK 集给供应商映像,则可以构建和运行供应商映像。
VNDK-core
VNDK-core 库集安装在 /system/lib[64]/vndk-${VER}
中,仅适用于 API 级别等于 ${VER}
的供应商进程。系统进程不得使用这些库,而必须使用安装在 /system/lib[64]
中的库。由于每个进程都有严格的命名空间限制,VNDK-core 库可以避免双重加载。
要将库包含在 VNDK-core 中,请将以下内容添加到 Android.bp
vendor_available: true, vndk: { enabled: true, },
VNDK-SP
VNDK-SP 库安装在 /system/lib[64]/vndk-sp-${VER}
中,可供供应商进程和系统进程使用(通过安装在供应商分区中的 SP-HAL 库)。VNDK-SP 库可能会被双重加载。
要将库包含在 VNDK-SP 中,请将以下内容添加到 Android.bp
vendor_available: true, vndk: { enabled: true, support_system_process: true, },
LL-NDK
LL-NDK 库安装在 /system/lib[64]
中。供应商模块可以使用 LL-NDK stub 库来访问 LL-NDK 库的预选符号。LL-NDK 库必须向后兼容且 ABI 稳定,以使旧版本的供应商模块可以使用新版本的 LL-NDK 库。由于 LL-NDK 的 ABI 稳定特性,VNDK 快照不需要为旧的供应商映像包含 LL-NDK 库。
关于 VNDK 快照
Android 8.1 包含了从源代码构建的 VNDK 库。但是,对于更高版本的 Android,每个 VNDK 版本都必须捕获为快照,并作为预构建提供,以便链接到旧的供应商映像。
从 Android 9 开始,新版本的 Android 将在 Android 源代码中至少包含一个旧版本的 VNDK-core 和 VNDK-SP 目录的快照。在构建时,所需的快照将安装到 /system/lib[64]/vndk-${VER}
和 /system/lib[64]/vndk-sp-${VER}
(供应商分区可以使用的目录),其中 ${VER}
是表示 VNDK 快照版本名称的字符串变量。
由于每个 VNDK 版本的 VNDK 快照库可能不同,VNDK 快照还包括链接器命名空间配置,安装为 etc/ld.config.${VER}.txt
、/etc/llndk.libraries.${VER}.txt
和 /etc/vndksp.libraries.${VER}.txt
。
示例:升级系统和供应商映像
无需快照;构建时无需 VNDK 快照的额外配置。
示例:仅升级系统映像
必须在系统映像中包含供应商映像的 VNDK 快照和链接器命名空间配置文件。链接器命名空间配置文件会自动配置为在 /system/lib[64]/vndk-${VER}
和 /system/lib[64]/vndk-sp-${VER}
中搜索 VNDK 库。

示例:升级系统映像,供应商映像的次要更改
尚不支持针对 VNDK 快照构建供应商映像,因此您必须使用其原始源代码单独构建供应商映像,然后按照上一个示例中的描述升级系统映像。
VNDK 快照架构
为了使 Android 9 系统映像与 Android 8.1 供应商映像兼容,必须为 Android 9 系统映像提供与 Android 8.1 供应商映像匹配的 VNDK 快照,如下所示

VNDK 快照设计包括以下方法
- 为 VNDK-core 和 VNDK-SP 库生成快照。Android 9 包含一个脚本,您可以使用该脚本制作当前 VNDK 构建的快照。此脚本捆绑了
/system/lib[64]/vndk-28
和/system/lib[64]/vndk-sp-28
中使用当前源代码构建的所有库作为 VNDK 快照,其中28
是 Android 9 的 VNDK 版本。快照还包括链接器命名空间配置文件/etc/ld.config.28.txt
、/etc/llndk.libraries.28.txt
和/etc/vndksp.libraries.28.txt
。生成的快照将用于更新的 Android 版本(高于 Android 9)。 - 从快照安装预构建的 VNDK-core 和 VNDK-SP 库。在 Android 9 中,VNDK 快照有一组预构建的 VNDK-core 库和一组 VNDK-SP 库,以及链接器命名空间配置文件。当您提供要安装的 VNDK 快照版本列表时,在构建时,系统映像会将 VNDK 快照库安装到
/system/lib[64]/vndk-${VER}
和/system/lib[64]/vndk-sp-${VER}
目录,并将这些 VNDK 快照的链接器命名空间配置文件安装到/etc
目录。
VNDK 版本控制
每个 Android 版本只有一个 VNDK 快照,SDK 版本用作 VNDK 版本(这意味着 VNDK 版本具有整数编号,例如 Android 8.1 的 27)。VNDK 版本在 Android 版本发布时是固定的。供应商分区使用的 VNDK 版本自动存储在 ro.vndk.version
属性中,可以在运行时读取。然后,此版本用于标识某些库的供应商 VNDK 版本,并标识命名空间配置的 VNDK 快照版本。
构建 VNDK 库
make vndk
命令构建具有 vndk: { enabled: true, … }
的库,包括依赖项和命名空间配置文件。如果设置了 BOARD_VNDK_VERSION := current
,则使用 make
命令构建这些库。
由于此构建不从快照安装 VNDK 库,因此安装的 VNDK 库不是 ABI 稳定的。但是,当 Android 版本发布时,当前 VNDK 版本的 ABI 是固定的。此时,任何 ABI 破坏都是构建错误,因此 Android 版本的补丁不得更改 VNDK 库的 ABI。