產生供應商快照

Android 11 支援 VNDK 快照建構構件和供應商快照,無論來源樹狀結構中的 Android 版本為何,您都可以使用這些構件建構 vendor.img。這樣就能混用不同版本的映像檔,例如舊版供應商和新版系統映像檔。

下列項目不支援混合映像檔版本。

  • 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 快照建構構件和供應商快照,即可建構 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