أداة تعريف VNDK

تساعد أداة تعريف 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 أيضًا.

العلاقات بين العلامات:

العلاقات بين العلامات.
الشكل 1. العلاقات بين العلامات.

إقلاع

لتصحيح تبعيات المكتبة، يقوم الأمر الفرعي 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 ، فستتم طباعة الرموز المستخدمة من قبل المستخدم.