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