أداة تعريف VNDK

تساعد أداة تعريف VNDK المورّدين في نقل شجرة المصدر إلى بيئة Android 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.

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 مكتبات مشترَكة ذات واجهات ثنائية للتطبيق (ABI) أو واجهات برمجة تطبيقات (API) ثابتة يمكن استخدامها من خلال كل من وحدات إطار العمل ووحدات المورّد.
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)
الدونغ الفيتنامي فقط المكتبات المشتركة غير المرئية لإطار العمل والتي يجب ألا تصل إليها وحدات إطار العمل يتم أيضًا تصنيف مكتبات VNDK الموسّعة المنسوخة على أنّها VND-ONLY.

العلاقات بين العلامات:

العلاقات بين العلامات

الشكل 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 معًا، تتم طباعة الرموز التي يستخدمها المستخدم.