أداة تعريف 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 ما يلي:

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
مورّد_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" وحدات المورّدين ويتحقّق من والتبعيات لديك. في حال رصد انتهاكات، يطبع أداة الاعتماد المستخدمة واستخدامات المكتبة والرموز:

./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 المكتبات المشتركة ذات واجهات ABI أو واجهات برمجة التطبيقات الثابتة التي يمكن استخدامها بواسطة إطار العمل ووحدات البائع.
LL-NDK-خاص التبعيات الخاصة لمكتبات LL-NDK. يجب ألّا تتمكّن وحدات المورّد من الوصول إلى هذه البيانات هذه المكتبات مباشرةً.
حزمة تطوير برامج (VNDK-SP) تبعيات المكتبات المشتركة في إطار SP-HAL.
VNDK-SP-خاصة تبعيات VNDK-SP التي لا يمكن لجميع البائعين الوصول إليها مباشرةً الوحدات.
الدونغ الفيتنامي (VNDK) المكتبات المشتركة لإطار العمل والمتاحة لوحدات المورّدين (باستثناء SP-HAL وSP-HAL-Dep).
VNDK-خاصة تبعيات VNDK التي لا يمكن لجميع البائعين الوصول إليها مباشرةً الوحدات.
إعادة تحميل المحتوى فقط المكتبات المشتركة لإطار العمل فقط والتي يجب ألا يصل إليها المورد الوحدات (ليس بشكل مباشر ولا غير مباشر).
عرض FWK فقط - RS المكتبات المشتركة لإطار العمل فقط والتي يجب ألا يصل إليها المورد الوحدات (باستثناء استخدامات RS).

يصف الجدول التالي العلامات المستخدمة للمكتبات المشتركة للمورّدين:

الإشارة الوصف
واجهة SP-HAL المكتبات المشتركة لتنفيذ HAL نفس العملية.
SP-HAL-Dep تبعيات المكتبات المشتركة لمورّد SP-HAL (تسمى أيضًا تبعيات SP-HAL) باستثناء LL-NDK وVNDK-SP).
دونغ فيتنامي فقط المكتبات المشتركة غير المرئية لإطار العمل والتي يجب ألا يتم الوصول إليها من خلال ووحدات إطار العمل. يتم وضع علامة على مكتبات VNDK الموسَّعة التي تم نسخها باعتبارها VND-ONLY أيضًا.

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

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

الشكل 1. العلاقات بين العلامات

الانخفاضات

لتصحيح الأخطاء الاعتمادية على المكتبة، تتم طباعة الأمر الفرعي deps. تبعيات الوحدة:

./vndk_definition_tool.py deps \
    --system ${ANDROID_PRODUCT_OUT}/system \
    --vendor ${ANDROID_PRODUCT_OUT}/vendor

يتكون الناتج من عدة أسطر. السطر الذي لا يحتوي على حرف مفتاح التبويب (Tab) تبدأ قسمًا جديدًا. ويعتمد السطر الذي يحتوي على حرف Tab على الحقل السابق . مثلاً:

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