أداة التحقّق من استخدامات واجهة التطبيق الثنائية (ABI) المُعدّة مسبقًا

تتطور المكتبات المشتركة في Android من حين لآخر. الاحتفاظ بالبرامج الثنائية التي تم إنشاؤها مسبقًا محدثة جهدًا كبيرًا. في Android 9 أو أقدم، البرامج الثنائية التي تم إنشاؤها مسبقًا والتي تعتمد على المكتبات التي تمت إزالتها أو واجهات التطبيق الثنائية (ABI) التي تمت إزالتها في وقت التشغيل فقط. على المطوّرين إجراء ما يلي: يمكنك تتبع السجلات للعثور على البرامج الثنائية التي تم إنشاؤها مسبقًا. في Android 10، تم طرح أداة التحقّق من استخدامات 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