ابزار تعریف VNDK به فروشندگان کمک میکند درخت منبع خود را به محیط Android 8.0 منتقل کنند. این ابزار فایلهای باینری را در سیستم و تصاویر فروشنده اسکن میکند و سپس وابستگیها را حل میکند. براساس نمودار وابستگی واحد، این ابزار همچنین میتواند نقضهای مفاهیم VNDK را شناسایی کند و اطلاعات آماری/پیشنهادهایی برای انتقال واحدها بین پارتیشنها ارائه دهد. اگر «تصویر سیستم عمومی» (GSI) مشخص شده باشد، ابزار تعریف VNDK میتواند تصویر سیستم شما را با GSI مقایسه کند و کتابخانههای توسعهیافته را تعیین کند.
این بخش سه فرمان پرکاربرد را برای ابزار تعریف VNDK پوشش میدهد:
vndk. محاسبه VNDK_SP_LIBRARIES، VNDK_SP_EXT_LIBRARIES، و EXTRA_VENDOR_LIBRARIES برای راهحل موقت سیستم ساخت در Android نسخه ۸.۰ و بالاتر.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_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
زیرفرمان 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 تولیدشده توسط سیستم ساخت Android اشاره میکند. این فایل به ابزار تعریف VNDK کمک میکند تا واحدهای دودویی را با کد منبع مرتبط کند. |
فایل برچسب کتابخانه واجدشرایط
Google صفحهگسترده واجدشرایط VNDK (مثلاً
eligible-list.csv) ارائه میدهد که کتابخانههای مشترک چارچوب را که
میتواند توسط واحدهای فروشنده استفاده شود نشانگذاری میکند:
| برچسب | شرح |
|---|---|
| LL-NDK | کتابخانههای مشترک با رابطهای کاربردی/رابطهای باینری پایدار که میتوانند توسط هر دو چارچوب و واحد فروشنده استفاده شوند. |
| LL-NDK-Private | وابستگیهای خصوصی کتابخانههای LL-NDK. مدولهای فروشنده نباید مستقیماً به این کتابخانهها دسترسی داشته باشند. |
| VNDK-SP | وابستگیهای کتابخانههای مشترک چارچوب SP-HAL. |
| VNDK-SP-Private | وابستگیهای VNDK-SP که مستقیماً برای همه پیمانههای فروشنده دردسترس نیستند. |
| VNDK | کتابخانههای مشترک چارچوب که برای ماژولهای فروشنده دردسترس هستند (بهجز SP-HAL و SP-HAL-Dep). |
| VNDK-Private | وابستگیهای VNDK که مستقیماً برای همه واحدهای فروشنده قابلدسترس نیستند. |
| FWK-ONLY | کتابخانههای مشترک فقط چارچوب که نباید توسط واحدهای فروشنده (نه مستقیم و نه غیرمستقیم) قابلدسترسی باشند. |
| FWK-ONLY-RS | کتابخانههای مشترک فقط چارچوب که نباید توسط واحدهای فروشنده به آنها دسترسی داده شود (بهجز برای استفادههای RS). |
جدول زیر برچسبهای مورداستفاده برای کتابخانههای مشترک فروشنده را شرح میدهد:
| برچسب | شرح |
|---|---|
| SP-HAL | کتابخانههای مشترک پیادهسازی HAL همفرایندی. |
| SP-HAL-Dep | وابستگیهای کتابخانههای مشترک فروشنده SP-HAL (که وابستگیهای SP-HAL نیز نامیده میشود بهجز LL-NDK و VNDK-SP). |
| فقط VND | کتابخانههای مشترک نامرئی چارچوب که نباید توسط واحدهای چارچوب به آنها دسترسی پیدا شود. کتابخانههای VNDK گسترشیافته کپیشده نیز بهعنوان VND-ONLY برچسبگذاری میشوند. |
رابطه بین برچسبها:
شکل ۱. روابط بین برچسبها.
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 مشخص شده باشد، نمادهای استفادهشده توسط کاربر چاپ میشود.