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

有關高級命令用法的更多詳細信息,請參閱 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_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指向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。

標籤之間的關係:

標籤之間的關係。
圖 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.solibdl.so使用,或者換句話說, libdl.so依賴於ld-android.so 。此外,此輸出顯示libdl.sold-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選項,則會列印使用者使用的符號。