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) 目標架構 (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-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_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
中。