ابزار تعریف 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 نیز برچسب گذاری می شوند. |
روابط بین برچسب ها:
![روابط بین تگ ها](https://source.android.com/docs/core/architecture/images/treble_vndk_design.png?authuser=4&hl=fa)
شکل 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
مشخص شده باشند، نمادهای استفاده شده توسط کاربر چاپ می شوند.