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