ابزار تعریف VNDK

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