تتطوّر مكتبات Android المشتركة من حين لآخر. يتطلّب إبقاء الثنائيات المُسبقة الإنشاء محدَّثة جهودًا كبيرة. في الإصدار 9 من نظام التشغيل Android أو الإصدارات الأقدم، لا يتم ربط الثنائيات المُسبقة الإنشاء التي تعتمد على مكتبات ABI أو مكتبات تمت إزالتها إلا في وقت التشغيل. على المطوّرين проследّي السجلات للعثور على الملفات الثنائية التي تم إنشاؤها مسبقًا والتي عفا عليها الزمن. في الإصدار 10 من Android، تمّ تقديم مدقّق لاستخدامات ABI المستندة إلى الرموز. يمكن لأداة التحقّق رصد البرامج الثنائية التي تم إنشاؤها مسبقًا والتي عفا عليها الزمن في وقت الإنشاء، حتى يتمكّن مطوّرو المكتبة المشترَكة من معرفة البرامج الثنائية التي تم إنشاؤها مسبقًا والتي قد تتعطّل بسبب المحتوى المتغيّر وتلك التي يجب إعادة إنشائها.
أداة التحقّق من استخدامات واجهات ABI المستندة إلى الرموز
يحاكي مدقّق استخدامات ABI المستند إلى الرموز الرابط الديناميكي لنظام Android على المضيف. يربط المدقّق الملف الثنائي المُنشئ مسبقًا بتبعيات الملف الثنائي المُنشئ مسبقًا ويتحقق مما إذا تم حلّ جميع الرموز غير المحدّدة.
أولاً، يتحقّق المدقّق من البنية المستهدفة للملف الثنائي المُنشئ مسبقًا. إذا لم يستهدف الملف الثنائي المُنشئ مسبقًا بنية ARM أو AArch64 أو x86 أو x86-64 ، يتخطّى المدقّق الملف الثنائي المُنشئ مسبقًا.
ثانيًا، يجب إدراج تبعيات الملف الثنائي المُنشئ مسبقًا فيملف LOCAL_SHARED_LIBRARIES
أو shared_libs
. يحلّ نظام الإنشاء
أسماء الوحدات إلى الصيغة المطابقة (أي
core
مقارنةً بـ vendor
) للمكتبات المشتركة.
ثالثًا، يقارن المدقّق إدخالات DT_NEEDED
بملف LOCAL_SHARED_LIBRARIES
أو shared_libs
. على وجه الخصوص،
يُستخرج المدقّق إدخال DT_SONAME
من كل مكتبة
مشترَكة ويقارن هذه الإدخالاتDT_SONAME
بإدخالات
DT_NEEDED
المسجّلة في الملف الثنائي المُنشئ مسبقًا. في حال عدم تطابق القيمة، يتم عرض رسالة خطأ.
رابعًا، يحلّ المدقّق الرموز غير المحدّدة في الملف الثنائي المُنشئ مسبقًا.
يجب تعريف هذه الرموز غير المحدّدة في إحدى التبعيات، ويجب أن يكون ربط
الرموز إما GLOBAL
أو WEAK
. إذا تعذّر حلّ رمز
غير محدّد، يتم عرض رسالة خطأ.
سمات وحدة التصاميم الجاهزة
يجب تحديد تبعيات الملف الثنائي المُنشئ مسبقًا في أحد العنصرين التاليين:
- Android.bp:
shared_libs: ["libc", "libdl", "libm"],
- Android.mk:
LOCAL_SHARED_LIBRARIES := libc libdl libm
إذا كان الملف الثنائي المُنشئ مسبقًا مصمّمًا ليحتوي على بعض الرموز غير المحدّدة التي لا يمكن حلّها، حدِّد أحد الخيارَين التاليَين:
- Android.bp:
allow_undefined_symbols: true,
- Android.mk:
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
لتخطّي الفحص في ملف ELF من خلال الملف الثنائي المُنشئ مسبقًا، حدِّد أحد الخيارين التاليين:
- Android.bp:
check_elf_files: false,
- Android.mk:
LOCAL_CHECK_ELF_FILES := false
تشغيل المدقّق
لتشغيل المدقّق، اضبط متغيّر البيئة
CHECK_ELF_FILES
على true
وشغِّل
make check-elf-files
:
CHECK_ELF_FILES=true make check-elf-files
لتفعيل أداة التحقّق تلقائيًا، أضِف PRODUCT_CHECK_ELF_FILES
إلى BoardConfig.mk
:
PRODUCT_CHECK_ELF_FILES := true
يتم التحقّق من الإصدارات المُسبقة الإنشاء تلقائيًا أثناء عملية إنشاء نظام التشغيل Android:
make