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