Android 11 支持 VNDK 快照构建工件和供应商快照,您可以使用它们来构建 vendor.img
,而无需考虑源代码树中的 Android 版本。这样就可以混合使用映像版本,例如较旧的供应商映像和较新的系统映像。
以下情况不支持混合映像版本。
Android.mk。
由于供应商快照由 Soong 生成,因此在Android.mk
中定义的模块不会作为供应商快照捕获(Android.mk
中的 SoC 专有模块也无法保证能够正常工作)。Sanitizer。供应商和 VNDK 快照不支持 Sanitizer,因为 Sanitizer 变体需要单独构建。
关于供应商快照
供应商快照是 OEM 拥有的快照。它是安装在 /vendor
中但在 AOSP 上维护的预构建 C++ 模块集。如果不捕获先前 Android 版本的供应商快照,则升级到新的 Android 版本可能会破坏供应商分区,因为供应商快照模块可能会被移除或更改,而无需 API 或 ABI 兼容性。
供应商快照包含 AOSP 上的以下模块。
- 带有
vendor: true
或vendor_available: true
的共享库、静态库和标头库 - 带有
vendor_available: true
的 VNDK 静态库 - 带有
vendor: true
或vendor_available: true
的可执行文件和目标文件
以下目录下的模块被视为 SoC 拥有的硬件代码,将被忽略。
device/
vendor/
hardware/
,但以下目录除外hardware/interfaces
hardware/libhardware
hardware/libhardware_legacy
SoC 拥有的硬件代码也可能存在于其他目录中。目前,供应商快照不支持此类配置。
构建供应商快照
使用以下命令构建供应商快照。
. build/envsetup.sh
lunch target
m dist vendor-snapshot
这些命令会在 $DIST_DIR
中创建一个 vendor-$(TARGET_DEVICE).zip
文件。以下示例显示了一个供应商快照 zip 文件
vendor-$(TARGET_DEVICE).zip
├── arch-arm64-armv8-a
│ ├── binary -> binary files, *.json files
│ ├── header -> *.json files
│ ├── object -> *.o files, *.json files
│ ├── shared -> *.so files, *.json files
│ └── static -> *.a files, *.json files
├── arch-arm-armv8-a -> (arch-arm64-armv8-a)
├── configs -> *.rc files, *.xml files
├── include -> exported header files (*.h, *.hh, etc.)
└── NOTICE_FILES -> license txt files
- JSON 文件包含模块名称、导出的目录、
init_rc
文件和vintf_fragments
文件等标志。 configs
目录包含来自标志init_rc
和vintf_fragments
的.rc
和.xml
文件。
安装供应商快照
要安装供应商快照,请导航到目标目录并使用以下命令。
python3 development/vendor_snapshot/update.py --local $DIST_DIR --install-dir \
vendor/vendor name/vendor_snapshot VER
此命令会生成 /vendor/vendor name/vendor_snapshot/vVER/$(TARGET_ARCH)/Android.bp
。以下示例显示了供应商快照的目录结构
vendor/vendor name/vendor_snapshot/
├── v30
│ ├── arm64
│ │ ├── arch-arm64-armv8-a
│ │ │ ├── binary -> (prebuilt libs)
│ │ │ ├── object -> (prebuilt libs)
│ │ │ ├── shared -> (prebuilt libs)
│ │ │ └── static -> (prebuilt libs)
│ │ ├── arch-arm-armv8-a -> (same as above)
│ │ ├── configs -> (config files)
│ │ ├── include -> (exported header files)
│ │ ├── NOTICE_FILES -> (license files)
│ │ └── Android.bp -> (snapshot modules)
│ ├── arm -> (same as above)
│ ├── x86_64 -> (same as above)
│ └── x86 -> (same as above)
└── (other vendor versions) -> (same as above)
构建供应商映像
使用 VNDK 快照构建工件和供应商快照,您可以构建 vendor.img
,而无需考虑源代码树上的 Android 版本,从而可以创建混合版本的映像。安装 VNDK 快照和供应商快照后,将 BOARD_VNDK_VERSION
设置为供应商的版本。例如
# BoardConfig.mk
BOARD_VNDK_VERSION := 29
当 BOARD_VNDK_VERSION
设置为 current
以外的值时,构建系统
- 启用
BOARD_VNDK_VERSION
的 VNDK 快照模块和供应商快照模块。每个快照模块都会覆盖具有相同名称的 C++ 源代码模块。 - 将
ro.vndk.version
设置为BOARD_VNDK_VERSION
。 - 将
BOARD_VNDK_VERSION
的 VNDK 快照模块安装到system_ext
。