ابزار تعریف VNDK

ابزار تعریف VNDK به فروشندگان کمک می کند درخت منبع خود را به محیط اندروید 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 Definition Tool مراجعه کنید.

vndk

دستور فرعی 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 نصب شود
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 به module-info.json که توسط سیستم ساخت اندروید تولید شده است اشاره می کند. این ابزار به ابزار تعریف VNDK کمک می کند تا ماژول های باینری را با کد منبع مرتبط کند.

فایل برچسب کتابخانه واجد شرایط

Google یک صفحه گسترده VNDK واجد شرایط ارائه می دهد (به عنوان مثال eligible-list.csv ) که کتابخانه های مشترک چارچوب را که می تواند توسط ماژول های فروشنده استفاده شود، برچسب گذاری می کند:

برچسب بزنید توضیحات
LL-NDK کتابخانه‌های مشترک با ABI/APIهای پایدار که می‌توانند توسط ماژول‌های فریمورک و فروشنده استفاده شوند.
LL-NDK-خصوصی وابستگی های خصوصی کتابخانه های LL-NDK. ماژول های فروشنده نباید مستقیماً به این کتابخانه ها دسترسی داشته باشند.
VNDK-SP چارچوب SP-HAL وابستگی های کتابخانه های مشترک.
VNDK-SP-Private وابستگی های VNDK-SP که به طور مستقیم برای همه ماژول های فروشنده قابل دسترسی نیستند.
VNDK چارچوب کتابخانه های مشترکی که در دسترس ماژول های فروشنده است (به جز SP-HAL و SP-HAL-Dep).
VNDK-خصوصی وابستگی های VNDK که مستقیماً برای همه ماژول های فروشنده قابل دسترسی نیستند.
FWK-ONLY کتابخانه های مشترک فقط چارچوب که نباید توسط ماژول های فروشنده (نه به طور مستقیم و نه غیر مستقیم) قابل دسترسی باشند.
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 مشخص شده باشند، نمادهای استفاده شده توسط کاربر چاپ می شوند.