VNDK 定義工具可協助供應商將來源樹狀結構遷移至 Android 8.0 環境。此工具會掃描系統和供應商映像檔中的二進位檔案,然後解析依附元件。這項工具還可根據模組依附元件圖表,偵測 VNDK 概念的違規情形,並提供有關在分區之間移動模組的洞察資訊/建議。如果指定通用系統映像檔 (GSI),VNDK 定義工具就能將系統映像檔與 GSI 進行比較,並判斷要擴充哪些程式庫。
本節將介紹 VNDK 定義工具的三個常用指令:
vndk
。針對 Android 8.0 以上版本的建構系統解決方法,計算 VNDK_SP_LIBRARIES、VNDK_SP_EXT_LIBRARIES 和 EXTRA_VENDOR_LIBRARIES。check-dep
。檢查供應商模組違反的模組依附元件,這些依附元件會導致不符合資格的架構共用程式庫。deps
:列印共用程式庫和執行檔之間的依附元件。
如要進一步瞭解進階指令的用法,請參閱 VNDK 定義工具存放區中的 README.md 檔案。
vndk
vndk
子命令會從系統分區和供應商分區載入共用程式庫和可執行檔,然後解析模組依附元件,以決定必須複製至 /system/lib[64]/vndk-sp-${VER}
和 /vendor/lib[64]
的程式庫。vndk
子指令的選項包括:
選項 | 說明 |
---|---|
--system |
指向包含系統分區中檔案的目錄。 |
--vendor |
指向包含供應商分區中檔案的目錄。 |
--aosp-system |
指向包含通用系統映像檔 (GSI) 中檔案的目錄。 |
--load-extra-deps |
指向說明隱含依附元件的檔案,例如 dlopen() 。 |
舉例來說,如要計算 VNDK 程式庫集合,請執行下列 vndk
子命令:
./vndk_definition_tool.py vndk \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor \
--aosp-system ${ANDROID_PRODUCT_OUT}/../generic_arm64_ab/system\
--load-extra-deps dlopen.dep
使用簡單的檔案格式指定額外依附元件。每行代表一種關係,其中冒號前面的檔案取決於冒號後面的檔案。例如:
/system/lib/libart.so: /system/lib/libart-compiler.so
這行會讓 VNDK 定義工具知道 libart.so
依附 libart-compiler.so
。
安裝目的地
VNDK 定義工具會列出下列類別的程式庫和相應的安裝目錄:
類別 | 目錄 |
---|---|
vndk_sp | 必須安裝到 /system/lib[64]/vndk-sp-${VER} |
vndk_sp_ext | 必須安裝到 /vendor/lib[64]/vndk-sp |
extra_vendor_libs | 必須安裝到 /vendor/lib[64] |
建構系統範本
從 VNDK 定義工具收集輸出內容後,供應商可以建立 Android.mk
,並填入 VNDK_SP_LIBRARIES
、VNDK_SP_EXT_LIBRARIES
和 EXTRA_VENDOR_LIBRARIES
,以自動化將程式庫複製至指定安裝目的地的程序。
ifneq ($(filter $(YOUR_DEVICE_NAME),$(TARGET_DEVICE)),) VNDK_SP_LIBRARIES := ##_VNDK_SP_## VNDK_SP_EXT_LIBRARIES := ##_VNDK_SP_EXT_## EXTRA_VENDOR_LIBRARIES := ##_EXTRA_VENDOR_LIBS_## #------------------------------------------------------------------------------- # VNDK Modules #------------------------------------------------------------------------------- LOCAL_PATH := $(call my-dir) define define-vndk-lib include $$(CLEAR_VARS) LOCAL_MODULE := $1.$2 LOCAL_MODULE_CLASS := SHARED_LIBRARIES LOCAL_PREBUILT_MODULE_FILE := $$(TARGET_OUT_INTERMEDIATE_LIBRARIES)/$1.so LOCAL_STRIP_MODULE := false LOCAL_MULTILIB := first LOCAL_MODULE_TAGS := optional LOCAL_INSTALLED_MODULE_STEM := $1.so LOCAL_MODULE_SUFFIX := .so LOCAL_MODULE_RELATIVE_PATH := $3 LOCAL_VENDOR_MODULE := $4 include $$(BUILD_PREBUILT) ifneq ($$(TARGET_2ND_ARCH),) ifneq ($$(TARGET_TRANSLATE_2ND_ARCH),true) include $$(CLEAR_VARS) LOCAL_MODULE := $1.$2 LOCAL_MODULE_CLASS := SHARED_LIBRARIES LOCAL_PREBUILT_MODULE_FILE := $$($$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_INTERMEDIATE_LIBRARIES)/$1.so LOCAL_STRIP_MODULE := false LOCAL_MULTILIB := 32 LOCAL_MODULE_TAGS := optional LOCAL_INSTALLED_MODULE_STEM := $1.so LOCAL_MODULE_SUFFIX := .so LOCAL_MODULE_RELATIVE_PATH := $3 LOCAL_VENDOR_MODULE := $4 include $$(BUILD_PREBUILT) endif # TARGET_TRANSLATE_2ND_ARCH is not true endif # TARGET_2ND_ARCH is not empty endef $(foreach lib,$(VNDK_SP_LIBRARIES),\ $(eval $(call define-vndk-lib,$(lib),vndk-sp-gen,vndk-sp,))) $(foreach lib,$(VNDK_SP_EXT_LIBRARIES),\ $(eval $(call define-vndk-lib,$(lib),vndk-sp-ext-gen,vndk-sp,true))) $(foreach lib,$(EXTRA_VENDOR_LIBRARIES),\ $(eval $(call define-vndk-lib,$(lib),vndk-ext-gen,,true))) #------------------------------------------------------------------------------- # Phony Package #------------------------------------------------------------------------------- include $(CLEAR_VARS) LOCAL_MODULE := $(YOUR_DEVICE_NAME)-vndk LOCAL_MODULE_TAGS := optional LOCAL_REQUIRED_MODULES := \ $(addsuffix .vndk-sp-gen,$(VNDK_SP_LIBRARIES)) \ $(addsuffix .vndk-sp-ext-gen,$(VNDK_SP_EXT_LIBRARIES)) \ $(addsuffix .vndk-ext-gen,$(EXTRA_VENDOR_LIBRARIES)) include $(BUILD_PHONY_PACKAGE) endif # ifneq ($(filter $(YOUR_DEVICE_NAME),$(TARGET_DEVICE)),)
check-dep
check-dep
子命令會掃描供應商模組,並檢查其依附元件。如果偵測到違規情形,就會列印違規的依附程式庫和符號用法:
./vndk_definition_tool.py check-dep \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor \
--tag-file eligible-list.csv \
--module-info ${ANDROID_PRODUCT_OUT}/module-info.json \
1> check_dep.txt \
2> check_dep_err.txt
舉例來說,以下輸出範例顯示從 libRS_internal.so
到 libmediandk.so
的違規依附元件:
/system/lib/libRS_internal.so MODULE_PATH: frameworks/rs /system/lib/libmediandk.so AImageReader_acquireNextImage AImageReader_delete AImageReader_getWindow AImageReader_new AImageReader_setImageListener
check-dep
子指令的選項包括:
選項 | 說明 |
---|---|
--tag-file |
必須參照符合資格的程式庫標記檔案 (如下所述),這是 Google 提供的試算表,可說明架構共用程式庫的類別。 |
--module-info |
指向由 Android 建構系統產生的 module-info.json 。這有助於 VNDK 定義工具將二進位模組與原始碼建立關聯。 |
符合資格的程式庫標記檔案
Google 提供符合資格的 VNDK 試算表 (例如 eligible-list.csv
),標示供應商模組可使用的架構共用程式庫:
標記 | 說明 |
---|---|
LL-NDK | 共用程式庫,其中包含穩定的 ABI/API,可供架構和供應商模組使用。 |
LL-NDK-Private | LL-NDK 程式庫的私人依附元件。供應商模組不得直接存取這些程式庫。 |
VNDK-SP | SP-HAL 架構共用程式庫依附元件。 |
VNDK-SP-Private | 所有供應商模組無法直接存取的 VNDK-SP 依附元件。 |
VNDK | 供應商模組可用的架構共用程式庫 (SP-HAL 和 SP-HAL-Dep 除外)。 |
VNDK-Private | 所有供應商模組無法直接存取的 VNDK 依附元件。 |
FWK 專用 | 供應商模組不得直接或間接存取的僅限架構共用程式庫。 |
FWK-ONLY-RS | 僅限架構的共用程式庫,供應商模組不得存取 (除了 RS 用途)。 |
下表說明供應商共用程式庫使用的標記:
標記 | 說明 |
---|---|
SP-HAL | 相同程序 HAL 實作共用程式庫。 |
SP-HAL-Dep | SP-HAL 供應商共用程式庫依附元件 (也稱為 SP-HAL 依附元件,不含 LL-NDK 和 VNDK-SP)。 |
VND-ONLY | 架構模組不得存取的架構不可見共用程式庫。複製的擴充 VNDK 程式庫也會標示為 VND-ONLY。 |
標籤之間的關係:

圖 1. 標籤之間的關係。
deps
如要對程式庫依附元件進行偵錯,deps
子命令會列印模組依附元件:
./vndk_definition_tool.py deps \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor
輸出內容包含多行。不含定位字元的行會開始新的段落。含有制表符號的行取決於前一個區段。例如:
/system/lib/ld-android.so /system/lib/libc.so /system/lib/libdl.so
這項輸出內容顯示 ld-android.so
沒有依附元件,而 libc.so
則依附 libdl.so
。
指定 --revert
選項時,deps
子命令會列印程式庫用法 (反向依附元件):
./vndk_definition_tool.py deps \
--revert \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor
例如:
/system/lib/ld-android.so /system/lib/libdl.so
這項輸出內容顯示 ld-android.so
由 libdl.so
使用,換句話說,libdl.so
依賴 ld-android.so
。此外,這項輸出內容顯示 libdl.so
是 ld-android.so
的唯一使用者。
指定 --symbol
選項時,deps
子命令會列印所使用的符號:
./vndk_definition_tool.py deps \
--symbol \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor
例如:
/system/lib/libc.so /system/lib/libdl.so android_get_application_target_sdk_version dl_unwind_find_exidx dlclose dlerror dlopen dlsym
這份輸出內容顯示 libc.so
會依賴從 libdl.so
匯出的六個函式。如果同時指定 --symbol
和 --revert
選項,系統會列印使用者使用的符號。