ابزار تعریف VNDK به فروشندگان کمک میکند تا درخت منبع خود را به محیط اندروید ۸.۰ منتقل کنند. این ابزار فایلهای باینری موجود در سیستم و تصاویر فروشنده را اسکن میکند و سپس وابستگیها را برطرف میکند. بر اساس نمودار وابستگی ماژول، این ابزار همچنین میتواند تخلفات مربوط به مفاهیم VNDK را تشخیص دهد و بینش/پیشنهاداتی برای جابجایی ماژولها بین پارتیشنها ارائه دهد. اگر یک تصویر سیستم عمومی (GSI) مشخص شده باشد، ابزار تعریف VNDK میتواند تصویر سیستم شما را با GSI مقایسه کرده و کتابخانههای توسعهیافته را تعیین کند.
این بخش سه دستور پرکاربرد برای ابزار تعریف VNDK را پوشش میدهد:
-
vndk. برای حل مشکل سیستم ساخت در اندروید ۸.۰ و بالاتر، VNDK_SP_LIBRARIES، VNDK_SP_EXT_LIBRARIES و EXTRA_VENDOR_LIBRARIES را محاسبه کنید. -
check-depوابستگیهای ماژول متخلف را از ماژولهای فروشنده به کتابخانههای اشتراکی چارچوب غیرمجاز بررسی کنید. -
deps. وابستگیهای بین کتابخانههای مشترک و فایلهای اجرایی را چاپ میکند.
برای جزئیات بیشتر در مورد استفاده از دستورات پیشرفته، به فایل README.md در مخزن ابزار تعریف VNDK مراجعه کنید.
وندک
زیردستور vndk کتابخانههای مشترک و فایلهای اجرایی را از پارتیشن سیستم و پارتیشنهای فروشنده بارگذاری میکند، سپس وابستگیهای ماژول را برای تعیین کتابخانههایی که باید در /system/lib[64]/vndk-sp-${VER} و /vendor/lib[64] کپی شوند، حل میکند. گزینههای زیردستور vndk عبارتند از:
| گزینه | توضیحات |
|---|---|
--system | به دایرکتوری حاوی فایلهایی که در پارتیشن سیستم قرار دارند، اشاره میکند. |
--vendor | به دایرکتوری حاوی فایلهایی که در پارتیشن 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_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 | باید به یک فایل برچسب کتابخانه واجد شرایط (که در زیر توضیح داده شده است) مراجعه کنید، که یک صفحه گسترده ارائه شده توسط گوگل است که دسته بندی کتابخانه های مشترک چارچوب را شرح می دهد. |
--module-info | به module-info.json تولید شده توسط سیستم ساخت اندروید اشاره میکند. این به ابزار تعریف VNDK کمک میکند تا ماژولهای دودویی را با کد منبع مرتبط کند. |
فایل برچسب کتابخانه واجد شرایط
گوگل یک فایل اکسل واجد شرایط 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-RS | کتابخانههای اشتراکی مختص فریمورک که نباید توسط ماژولهای فروشنده (به جز کاربردهای RS) قابل دسترسی باشند. |
جدول زیر تگهای مورد استفاده برای کتابخانههای اشتراکی فروشنده را شرح میدهد:
| برچسب | توضیحات |
|---|---|
| SP-HAL | کتابخانههای مشترک پیادهسازی HAL با فرآیند یکسان. |
| SP-HAL-Dep | وابستگیهای کتابخانههای اشتراکی فروشنده SP-HAL (همچنین وابستگیهای SP-HAL به استثنای LL-NDK و VNDK-SP نامیده میشوند). |
| فقط VND | کتابخانههای اشتراکی نامرئی در چارچوب که نباید توسط ماژولهای چارچوب قابل دسترسی باشند. کتابخانههای VNDK توسعهیافته کپیشده نیز با برچسب VND-ONLY مشخص شدهاند. |
روابط بین برچسبها:

شکل ۱. روابط بین برچسبها.
دپس
برای اشکالزدایی وابستگیهای کتابخانه، زیردستور 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 مشخص شده باشند، نمادهای استفاده شده توسط کاربر چاپ میشوند.