ابزار تعریف VNDK

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