أداة تعريف 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 المكتبات المشترَكة والملفات التنفيذية من قسم النظام وأقسام المورّدين، ثمّ تحلّ vndk تبعيات الوحدات لتحديد المكتبات التي يجب نسخها إلى /system/lib[64]/vndk-sp-${VER} و/vendor/lib[64]. تشمل خيارات الأمر الفرعي vndk ما يلي:

Option الوصف
--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 ما يلي:

Option الوصف
--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-ONLY" أيضًا على مكتبات VNDK الموسّعة التي تم نسخها.

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

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

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