生成供应商快照

Android 11 支持 VNDK 快照构建工件和供应商快照,可用于构建 vendor.img,无论源代码树的 Android 版本如何。这样可以实现映像版本(如较旧的供应商映像和较新的系统映像)的混合。

以下对象不支持混合映像版本。

  • Android.mk. 由于 Soong 会生成供应商快照,因此 Android.mk 中定义的模块不会以供应商快照形式捕获(也无法保证 Android.mk 中的 SoC 专用模块正常工作)。

  • 清理程序。供应商和 VNDK 快照不支持清理程序,因为清理程序变体需要单独构建。

关于供应商快照

供应商快照是 OEM 拥有的快照。它是一组预构建的 C++ 模块,安装在 /vendor 中,但在 AOSP 中维护。如果没有捕获旧 Android 版本的供应商快照,升级到新 Android 版本可能会破坏供应商分区,因为供应商快照模块可以在不具备 API 或 ABI 兼容性的情况下移除或更改。

供应商快照包含 AOSP 中的以下模块。

  • 满足 vendor: truevendor_available: true 的共享库、静态库和头文件库
  • 满足 vendor_available: true 的 VNDK 静态库
  • 满足 vendor: truevendor_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_rcvintf_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 快照构建工件和供应商快照,无论源代码树中的 Android 版本如何,您都可以构建 vendor.img,从而创建混合版映像。安装 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