تساعد أداة تعريف 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 |
| 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) |
| دونغ فيتنامي فقط | المكتبات المشتركة غير المرئية لإطار العمل والتي يجب ألا تصل إليها وحدات إطار العمل يتم أيضًا تصنيف مكتبات 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 معًا، تتم طباعة الرموز التي يستخدمها المستخدم.