VNDK 定義工具可協助廠商將其來源樹狀結構遷移至 Android 8.0 環境。這項工具會掃描系統和供應商中的二進位檔案 會解析依附元件根據模組依附元件圖表 這項工具也能偵測 VNDK 概念的違規事項 在不同分區之間移動模組的深入分析/建議。如果是通用系統 映像檔 (GSI) 已指定,VNDK 定義工具可比對您的系統 並決定擴充程式庫
本節說明 VNDK 定義的三種常用指令 工具:
vndk
。計算 VNDK_SP_LIBRARIES、VNDK_SP_EXT_LIBRARIES,以及 EXTRA_VENDOR_LIBRARIES 適用於 Android 8.0 和 更高。check-dep
。查看下列來源中的違規模組依附元件: 將供應商模組套用至不符資格的架構共用程式庫。deps
。列印共用程式庫與 可執行檔
如要進一步瞭解進階指令用法,請參閱 README.md 安裝於 VNDK 定義工具存放區
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
子指令會掃描供應商模組並檢查其
依附元件如果偵測到違規,系統會輸出違規的相依項目
程式庫和符號的使用:
./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
有些人會將 Cloud Storage 視為檔案系統
但實際上不是這可協助 VNDK 定義工具將二進位模組與來源建立關聯
再也不是件繁重乏味的工作 |
符合資格的程式庫代碼檔案
Google 會提供符合資格的 VNDK 試算表 (例如
eligible-list.csv
),會標記框架共用程式庫
可由供應商模組使用:
標記 | 說明 |
---|---|
LL-NDK | 具備穩定 ABI/API 的共用程式庫,可同時用於 架構和供應商模組 |
LL-NDK-私人 | LL-NDK 程式庫的私人依附元件。供應商模組不得存取 這些程式庫 |
越南盾 | SP-HAL 架構共用程式庫依附元件。 |
VNDK-SP-私人 | 並非所有供應商都能直接存取的 VNDK-SP 依附元件 模組。 |
越南盾 | 供應商模組可用的架構共用程式庫 (除了 SP-HAL 和 SP-HAL-Dep)。 |
VNDK-私人 | 各供應商都無法直接存取的 VNDK 依附元件 模組。 |
僅限足球 | 供應商不得存取僅限架構使用的共用程式庫 都沒有關係。 |
僅限回覆 | 供應商不得存取僅限架構使用的共用程式庫 模組 (RS 用途除外)。 |
下表說明供應商共用程式庫使用的代碼:
標記 | 說明 |
---|---|
SP-HAL | 相同程序 HAL 實作共用資料庫。 |
SP-HAL-Dep | SP-HAL 供應商共用程式庫依附元件 (也稱為 SP-HAL 依附元件) (不包括 LL-NDK 和 VNDK-SP)。 |
僅限越南 | 不得由架構存取的隱形共用程式庫 基礎架構模組複製的擴充 VNDK 程式庫會標記為 且僅限越南。 |
標記之間的關係:
圖 1. 標記之間的關係。
deps
如要對程式庫依附元件偵錯,deps
子指令會顯示
模組依附元件:
./vndk_definition_tool.py deps \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor
輸出結果包含多行內容。沒有 Tab 字元的行 開始新區段含有定位字元的行取決於 專區。例如:
/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
選項,且使用者使用的符號
。