أداة تعريف 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
إكسترا_فيندور_ليبس يجب التثبيت لـ /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 ) التي تحدد مكتبات إطار العمل المشتركة التي يمكن استخدامها بواسطة وحدات البائعين:

بطاقة شعار وصف
LL-NDK مكتبات مشتركة ذات واجهات برمجة تطبيقات / واجهات برمجة تطبيقات ثابتة يمكن استخدامها من قبل كل من إطار العمل ووحدات البائع.
LL-NDK- خاص التبعيات الخاصة لمكتبات LL-NDK. يجب ألا تقوم وحدات البائع بالوصول إلى هذه المكتبات مباشرة.
VNDK-SP إطار عمل SP-HAL تبعيات المكتبات المشتركة.
VNDK-SP- خاص تبعيات VNDK-SP التي لا يمكن الوصول إليها مباشرة لجميع وحدات البائعين النمطية.
VNDK مكتبات الإطار المشتركة المتوفرة لوحدات البائعين النمطية (باستثناء SP-HAL و SP-HAL-Dep).
VNDK- خاص تبعيات VNDK التي لا يمكن الوصول إليها مباشرة لجميع وحدات البائعين.
FWK- فقط مكتبات مشتركة ذات إطار عمل فقط والتي يجب ألا يتم الوصول إليها بواسطة وحدات البائع (سواء بشكل مباشر أو غير مباشر).
FWK-ONLY-RS مكتبات مشتركة ذات إطار عمل فقط والتي يجب ألا يتم الوصول إليها بواسطة وحدات البائع (باستثناء استخدامات RS).

يصف الجدول التالي العلامات المستخدمة للمكتبات المشتركة للبائع:

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