生成供應商快照

Android 11 支持VNDK 快照構建工件和供應商快照,無論源代碼樹上的 Android 版本如何,您都可以使用它們構建vendor.img 。這支持混合版本的映像,例如較舊的供應商和較新的系統映像。

以下內容不支持混合圖像版本。

  • Android.mk.因為 Soong 生成供應商快照,所以Android.mk中定義的模塊不會被捕獲為供應商快照( Android.mk中的 SoC 專有模塊也不能保證正常工作)。

  • 消毒劑。供應商和 VNDK 快照不支持 sanitizer,因為需要單獨構建 sanitizer 變體。

關於供應商快照

供應商快照是 OEM 擁有的快照。它是一組安裝在/vendor中但在 AOSP 上維護的預構建 C++ 模塊。如果不捕獲先前 Android 版本的供應商快照,升級到新的 Android 版本可能會破壞供應商分區,因為可以在沒有 API 或 ABI 兼容性的情況下刪除或更改供應商快照模塊。

供應商快照包含 AOSP 上的以下模塊。

  • vendor: truevendor_available: true共享、靜態和頭庫
  • VNDK 靜態庫與vendor_available: true
  • 帶有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/v VER /$(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 的BOARD_VNDK_VERSION快照模塊和供應商快照模塊。每個快照模塊都會覆蓋具有相同名稱的 C++ 源模塊。
  • ro.vndk.version設置為BOARD_VNDK_VERSION
  • 將 BOARD_VNDK_VERSION 的BOARD_VNDK_VERSION快照模塊安裝到system_ext