產生 VNDK 快照

VNDK 快照是 Android 版本的 VNDK-core 和 VNDK-SP 程式庫組合。如果 system.img 包含 vendor.img 所需的對應 VNDK 快照,您只能升級系統分割區。

官方 VNDK 快照會在 Android 建構伺服器上自動建構,並檢查 Android 來源樹狀結構的 /prebuilts/vndk。為了開發目的,您可以在本機建構 VNDK 快照。VNDK 快照支援 arm、arm64、x86 和 x86_64 TARGET_ARCH 版本。

建立快照

Android 建構伺服器會使用下列建構參數和建構指令,產生建構構件和 VNDK 快照檔案。

建構參數

建構目標名稱為 vndk。下方顯示建構目標設定。

TARGET_PRODUCT TARGET_ARCH TARGET_ARCH_VARIANT
aosp_arm arm armv7-a-neon
aosp_arm64 arm64 armv8-a
aosp_x86 x86 x86
aosp_x86_64 x86_64 x86_64
  • TARGET_PRODUCT=aosp_$(TARGET_ARCH)
  • TARGET_BUILD_VARIANT=user
  • TARGET_ARCH 與通用系統映像檔 (GSI) 目標架構 (armarm64x86x86_64) 相同。
  • TARGET_ARCH_VARIANT:針對快照 v28 (Android 9) 以上版本,包含上述熱門設定。

建構指令

針對官方快照,Android 9 以上版本在 vndk.mk 中加入範例目標 (vndk),可建構並將 VNDK 快照輸出至 $DIST_DIR。快照 ZIP 檔案使用 android-vndk-$(TARGET_ARCH).zip 格式。例如:

lunch aosp_TARGET_ARCH-user
make -j vndk dist [BOARD_VNDK_VERSION=current]

Android 建構伺服器會使用 build.sh 指令碼,透過下列指令建構所有支援的架構變化版本。

DIST_DIR=dist_dir development/vndk/snapshot/build.sh

Android 版本的 VNDK 快照會從該版本的發布分支產生。

在本機建構

開發期間,您可以使用下列指令,從本機來源樹狀結構建構 VNDK 快照。

  • 如要一次建構所有支援的架構,請執行下列建構指令碼 (build.sh)。
    cd $ANDROID_BUILD_TOP
    development/vndk/snapshot/build.sh
  • 如要建構特定 TARGET_ARCH,請執行下列指令。
    lunch aosp_TARGET_ARCH-user
    m -j vndk dist

系統會在 $DIST_DIR 下建立相對應的 android-vndk-$(TARGET_ARCH).zip 檔案。

快照檔案

VNDK 快照包含下列檔案。

  • VNDK-core 和 VNDK-SP 共用程式庫的供應商變化版本。
    • 由於 LL-NDK 共用程式庫具有回溯相容性,因此不需要使用這些程式庫。
    • 對於 64 位元目標,系統會建構並納入 TARGET_ARCHTARGET_2ND_ARCH 程式庫。
  • VNDK-core、VNDK-SP、LL-NDK 和 VNDK-private 程式庫的清單位於 [vndkcore|vndksp|llndk|vndkprivate].libraries.txt
  • 授權檔案。
  • module_paths.txt:記錄所有 VNDK 程式庫的模組路徑,以便檢查 GPL 專案是否在特定 Android 來源樹狀結構中發布來源。

對於特定的 VNDK 快照 ZIP 檔案 android-vndk-$(TARGET_ARCH).zip,VNDK 預先建構的程式庫會依據 ABI 位元組數,在名為 arch-$(TARGET_ARCH)-$(TARGET_ARCH_VARIANT) 的不同目錄中分組。舉例來說,對於 android-vndk-arm64.zip,64 位元程式庫會放在 arch-arm64-armv8-a 下方,而 32 位元程式庫則會放在 arch-arm-armv8-a 下方。以下範例顯示 arm64 (TARGET_ARCH=arm64) VNDK 快照 ZIP 檔案 (android-vndk-arm64.zip) 的目錄結構。

VNDK 快照目錄結構
圖 1. VNDK 快照目錄結構 (範例)

為供應商快照建構

Android 11 支援供應商快照,無論來源樹狀結構中的 Android 版本為何,您都可以建構 vendor.img。預設的 VNDK 快照包含可安裝至裝置的共用資料庫檔案 (.so),然後在執行階段從供應商 C++ 二進位檔連結。如要針對該 VNDK 快照進行建構,您需要額外的構件,例如標頭檔案和匯出的旗標。

如要從本機來源樹狀結構產生這類構件 (以及 VNDK 快照),請使用下列指令。

VNDK_SNAPSHOT_BUILD_ARTIFACTS=true development/vndk/snapshot/build.sh

這個指令會在 $DIST_DIR 下建立 android-vndk-$(TARGET_ARCH).zip 檔案。以下範例是 arm64 VNDK 快照 ZIP 檔案,其中包含建構構件。粗體顯示的檔案是新增至一般 VNDK 快照的檔案 (如圖 1 所示),其中包含 JSON 檔案 (可儲存每個程式庫的 cflags) 和所有匯出的標頭檔案。

android-vndk-arm64.zip
├── arch-arm64-armv8-a
│   └── shared
│       ├── vndk-core  -> *.so files, *.json files
│       └── vndk-sp    -> *.so files, *.json files
├── arch-arm-armv8-a   -> (same as arch-arm64-armv8-a)
├── configs            -> *.libraries.txt, module_paths.txt, module_names.txt
├── include            -> exported header files (*.h, *.hh, etc.)
└── NOTICE_FILES       -> license txt files

上傳 VNDK 快照

系統會在 /prebuilts/vndk/vVER 底下的來源樹狀結構中檢查 VNDK 快照,其中 VER 等於 VNDK 快照的版本 (依據對應 Android 版本的 SDK 版本)。舉例來說,Android 8.1 VNDK 快照有 27 版。

使用 update.py 指令碼

update.py 指令碼 (/development/vndk/snapshot/update.py) 會自動將預先建構的 VNDK 快照新增至來源樹狀結構。它會自動偵測建構構件,並在產生的 Android.bp 中適當填入相關聯的屬性。此指令碼會執行下列工作:

  1. /prebuilts/vndk/vVER 中,使用 repo start 建立新的 Git 分支。
  2. 擷取並解壓縮 VNDK 快照建構構件。
  3. 執行 gen_buildfiles.py 自動產生建構檔案 (Android.bp)。
  4. 執行 check_gpl_license.py,確認根據通用公眾授權 (GPL) 授權的預先建構程式庫,是否已在目前的來源樹狀結構中發布來源。
  5. 使用 git commit 提交新的變更。

使用本機建構的 VNDK 快照

您也可以使用本機建構的 VNDK 快照。指定 --local 選項後,update.py 指令碼會從指定的本機目錄 (而非 Android 建構伺服器) 擷取 VNDK 快照建構構件,該目錄包含從 development/vndk/snapshot/build.sh 產生的 android-vndk-$(TARGET_ARCH).zip 檔案。使用 --local 選項時,update.py 指令碼會略過 GPL 授權檢查和 git commit 步驟。

語法:

python update.py VER --local local_path

使用 /path/to/local/dir 中的本機建構構件更新 Android 8.1 VNDK 快照的範例指令:

python update.py 27 --local /path/to/local/dir

本機建構的 VNDK 快照目錄結構範例:

prebuilts/vndk
├── v30
│   ├── arm64
│   │   ├── arch-arm64-armv8-a -> (prebuilt libs)
│   │   ├── arch-arm-armv8-a   -> (prebuilt libs)
│   │   ├── configs            -> (config files)
│   │   ├── include            -> (exported header files)
│   │   └── Android.bp         -> (VNDK modules with cflags)
│   ├── arm                    -> (same as above)
│   ├── x86_64                 -> (same as above)
│   ├── x86                    -> (same as above)
│   ├── common
│   │   ├── NOTICE_FILES       -> (license files)
│   │   └── Android.bp         -> (license file modules)
│   └── Android.bp             -> (*.libraries.30.txt modules)
└── (other VNDK versions)      -> (same as above)
如果建構項目是使用 VNDK_SNAPSHOT_BUILD_ARTIFACTS=true 建構,系統會自動新增本機建構成果。

安裝 VNDK 快照

系統映像檔會在建構期間使用 BOARD_VNDK_VERSIONPRODUCT_EXTRA_VNDK_VERSIONSro.vndk.version 中的資訊,安裝 VNDK 快照程式庫。您可以使用下列任一選項,控制從預先建構的 VNDK 快照目錄 (例如 /prebuilts/vndk/v29/prebuilts/vndk/v30) 安裝哪些 VNDK 快照。

  • 選項 1: BOARD_VNDK_VERSION. 使用快照模組建構目前的供應商模組,並只安裝供應商模組所需的快照模組。
  • 選項 2: PRODUCT_EXTRA_VNDK_VERSIONS。無論目前的供應商模組為何,請安裝 VNDK 快照模組。這會安裝 PRODUCT_EXTRA_VNDK_VERSIONS 中列出的預建 VNDK 快照,且不會在建構時將這些快照連結至任何其他模組。

設定 BOARD_VNDK_VERSION

BOARD_VNDK_VERSION 會顯示目前供應商模組建構所需的 VNDK 版本。如果 BOARD_VNDK_VERSION/prebuilts/vndk 目錄中提供可用的 VNDK 快照版本,系統就會安裝 BOARD_VNDK_VERSION 中指示的 VNDK 快照。如果目錄中沒有 VNDK 快照,就會發生建構錯誤。

定義 BOARD_VNDK_VERSION 也會啟用 VNDK 模組的安裝作業。供應商模組會在建構期間連結至 BOARD_VNDK_VERSION 中定義的 VNDK 快照版本 (這不會在系統來源中建構目前的 VNDK 模組)。從存放區下載完整來源樹狀結構時,系統和供應商來源都會以相同的 Android 版本為基礎。

設定 PRODUCT_EXTRA_VNDK_VERSIONS

PRODUCT_EXTRA_VNDK_VERSIONS 會列出要安裝的額外 VNDK 版本。一般來說,只要為目前的供應商分區提供一個 VNDK 快照即可。不過,在某些情況下,您可能需要在一個系統映像檔中加入多個快照。舉例來說,GSI 有許多快照,可透過單一系統映像檔支援多個供應商版本。設定 PRODUCT_EXTRA_VNDK_VERSIONS 後,您除了可以安裝 BOARD_VNDK_VERSION 中的 VNDK 版本外,還可以安裝 VNDK 快照模組。

如果 PRODUCT_EXTRA_VNDK_VERSIONS 有特定的版本清單,建構系統會在 prebuilts/vndk 目錄中尋找版本清單的預先建構快照。如果建構系統找到所有列出的快照,就會將這些快照檔案安裝到每個 VNDK APEX (out/target/product/$(TARGET_DEVICE)/system_ext/apex/com.android.vndk.vVER)。缺少的版本會產生建構錯誤。

VNDK 模組不會在建構期間與供應商模組連結,但如果供應商分區中的供應商模組需要其中一個已安裝的 VNDK 版本,則可在執行階段使用。只有在定義 BOARD_VNDK_VERSION 時,PRODUCT_EXTRA_VNDK_VERSIONS 才有效。

PLATFORM_VNDK_VERSION

PLATFORM_VNDK_VERSION 會為系統來源中的現有 VNDK 模組定義 VNDK 版本。系統會自動設定值:

  • 在發布前,PLATFORM_VNDK_VERSION 會設為 PLATFORM_VERSION_CODENAME
  • 在發布時,PLATFORM_SDK_VERSION 會複製到 PLATFORM_VNDK_VERSION

Android 版本發布後,目前的 VNDK 程式庫會安裝至 VNDK APEX (/system/apex/com.android.vndk.vVER),其中 VER 是儲存在 PLATFORM_VNDK_VERSION 中的版本。

BOARD_VNDK_VERSION 設為 current 時,PLATFORM_VNDK_VERSION 會儲存在 ro.vndk.version 中,否則 BOARD_VNDK_VERSION 會儲存在 ro.vndk.version 中。PLATFORM_VNDK_VERSION 會在 Android 發布時設為 SDK 版本;在發布前,PLATFORM_VNDK_VERSION 會使用英數字母的 Android 程式碼名稱。

VNDK 版本設定摘要

下表概略列出 VNDK 版本設定。

供應商
Build
板卡
版本
SDK
版本
平台
版本
版本
屬性
安裝目錄
目前的 VNDK 模組 current 之前 CODE_NAME CODE_NAME /system/apex/com.android.vndk.vCODE_NAME
之後 SDK_VER SDK_VER /system/apex/com.android.vndk.vSDK_VER
預先建構的快照模組 VNDK_VER
(快照)
之前/之後 CODE_NAME
SDK_VER
VNDK_VER /system_ext/apex/com.android.vndk.vVNDK_VER
  • 板卡版本 (BOARD_VNDK_VERSION)。供應商模組建構所需的 VNDK 版本。如果供應商模組可以連結至目前的系統模組,請設為 current
  • Platform Version (PLATFORM_VNDK_VERSION):目前系統模組正在建構的 VNDK 版本。僅在 BOARD_VNDK_VERSION 等於 current 時建構。
  • 版本屬性 (ro.vndk.version)。此屬性可指定 vendor.img 中二進位檔和程式庫執行所需的 VNDK 版本。儲存在 /vendor/default.propvendor.img 中。