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=userTARGET_ARCH與通用系統映像檔 (GSI) 目標架構 (arm、arm64、x86、x86_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-usermake -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_TOPdevelopment/vndk/snapshot/build.sh - 如要建構特定
TARGET_ARCH,請執行下列指令。lunch aosp_TARGET_ARCH-userm -j vndk dist
系統會在 $DIST_DIR 下建立相對應的 android-vndk-$(TARGET_ARCH).zip 檔案。
快照檔案
VNDK 快照包含下列檔案。
- VNDK-core 和 VNDK-SP 共用程式庫的供應商變化版本。
- 由於 LL-NDK 共用程式庫具有回溯相容性,因此不需要使用這些程式庫。
- 對於 64 位元目標,系統會建構並納入
TARGET_ARCH和TARGET_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) 的目錄結構。
為供應商快照建構
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 中適當填入相關聯的屬性。此指令碼會執行下列工作:
- 在
/prebuilts/vndk/vVER中,使用repo start建立新的 Git 分支。 - 擷取並解壓縮 VNDK 快照建構構件。
- 執行
gen_buildfiles.py自動產生建構檔案 (Android.bp)。 - 執行
check_gpl_license.py,確認根據通用公眾授權 (GPL) 授權的預先建構程式庫,是否已在目前的來源樹狀結構中發布來源。 - 使用
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_VERSION、PRODUCT_EXTRA_VNDK_VERSIONS 和 ro.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.prop的vendor.img中。