تساعد أداة تعريف 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 أيضًا. |
العلاقات بين العلامات:
![العلاقات بين العلامات](https://source.android.google.cn/docs/core/architecture/images/treble_vndk_design.png?authuser=9&hl=ar)
الشكل 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
، وهي الرموز التي يستخدمها المستخدم
تتم طباعتها.