VNDK 定義工具可協助供應商將其原始碼樹遷移到 Android 8.0 環境。此工具掃描系統中的二進位檔案和供應商映像,然後解決相依性。基於模組依賴關係圖,該工具還可以檢測對 VNDK 概念的違反,並提供在分區之間移動模組的見解/建議。如果指定了通用系統映像 (GSI),VNDK 定義工具可以將您的系統映像與 GSI 進行比較並確定擴充庫。
本節介紹 VNDK 定義工具的三個常用指令:
-
vndk
。計算 VNDK_SP_LIBRARIES、VNDK_SP_EXT_LIBRARIES 和 EXTRA_VENDOR_LIBRARIES,以用於 Android 8.0 及更高版本中的建置系統解決方法。 -
check-dep
。檢查從供應商模組到不合格框架共享庫的違規模組依賴關係。 -
deps
。列印共享庫和可執行檔之間的依賴關係。
有關高級命令用法的更多詳細信息,請參閱 VNDK 定義工具存儲庫中的README.md檔案。
文德克
vndk
子命令從系統分區和供應商分區載入共享庫和可執行文件,然後解析模組依賴關係以確定必須複製到/system/lib[64]/vndk-sp-${VER}
和/vendor/lib[64]
庫/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 |
額外供應商庫 | 必須安裝到/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 。它幫助 VNDK 定義工具將二進位模組與原始程式碼關聯起來。 |
合格的庫標籤文件
Google 提供了一個符合條件的 VNDK 電子表格(例如eligible-list.csv
),該電子表格標記了供應商模組可以使用的框架共享庫:
標籤 | 描述 |
---|---|
NDK | 具有穩定 ABI/API 的共享庫可供框架和供應商模組使用。 |
LL-NDK-私人 | LL-NDK 函式庫的私有相依性。供應商模組不得直接存取這些庫。 |
VNDK-SP | SP-HAL 框架共用程式庫相依性。 |
VNDK-SP-私人 | 所有供應商模組無法直接存取 VNDK-SP 依賴項。 |
越南國家發展局 | 可用於供應商模組(SP-HAL 和 SP-HAL-Dep 除外)的框架共用程式庫。 |
VNDK-私人 | 並非所有供應商模組都可以直接存取 VNDK 依賴項。 |
僅限 FWK | 僅限框架的共享庫不得由供應商模組存取(無論是直接或間接)。 |
僅 FWK-RS | 僅框架共享庫,供應商模組不得存取(RS 使用除外)。 |
下表描述了用於供應商共享庫的標籤:
標籤 | 描述 |
---|---|
SP-HAL | 同進程 HAL 實作共享庫。 |
SP-HAL-Dep | SP-HAL 供應商共用程式庫相依性(也稱為 SP-HAL 依賴項,不包括 LL-NDK 和 VNDK-SP)。 |
僅限越南盾 | 框架不可見的共享庫不得被框架模組存取。複製的擴展 VNDK 庫也將被標記為 VND-ONLY。 |
標籤之間的關係:
部門
若要偵錯庫依賴項, 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
導出的 6 個函數。如果同時指定了--symbol
選項和--revert
選項,則會列印使用者使用的符號。