Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

VNDK定義工具

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 。打印共享庫和可執行文件之間的依賴關係。

有關高級命令用法的詳細信息,請參閱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_LIBRARIESVNDK_SP_EXT_LIBRARIESEXTRA_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.solibmediandk.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 module-info.json由Android構建系統生成的module-info.json 。它有助於VNDK定義工具將二進制模塊與源代碼關聯。

合格的庫標記文件

Google提供了一個合格的VNDK電子表格(例如eligible-list.csv ),用於標記供供應商模塊使用的框架共享庫:

標籤描述
LL-NDK具有穩定的ABI / API的共享庫,框架和供應商模塊均可使用。
LL-NDK-私人LL-NDK庫的私有依賴項。供應商模塊不得直接訪問這些庫。
VNDK-SP SP-HAL框架共享庫依賴性。
VNDK-SP-私人並非所有供應商模塊都可以直接訪問的VNDK-SP依賴項。
越南盾供應商模塊可用的框架共享庫(SP-HAL和SP-HAL-Dep除外)。
VNDK-私人並非所有供應商模塊都可以直接訪問的VNDK依賴關係。
僅FWK供應商模塊不能直接或間接訪問的僅限框架的共享庫。
FWK-ONLY-RS供應商模塊不得訪問的僅框架共享庫(RS使用除外)。

下表描述了用於供應商共享庫的標籤:

標籤描述
SP-HAL相同進程的HAL實現共享庫。
SP-HAL-Dep SP-HAL供應商共享庫的依賴性(又名SP-HAL依賴性,不包括LL-NDK和VNDK-SP)。
越南盾框架模塊不能訪問的框架不可見共享庫。複製的擴展VNDK庫也將標記為“僅VND”。

標籤之間的關係:

圖1.標籤之間的關係。

部門

要調試庫依賴關係, 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選項,則將打印用戶使用的符號。