أداة التحقّق من استخدامات واجهة التطبيق الثنائية (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

تشغيل أداة التحقّق

تشمل أداة التحقّق جميع وحدات ELF المنشأة مسبقًا أثناء عملية إصدار Android.

لتشغيل أداة الفحص فقط من أجل تحقيق أوقات استجابة أسرع:

m check-elf-files

أداة إصلاح أخطاء واجهة التطبيق الثنائية (ABI)

يمكن أن تساعد أداة الإصلاح التلقائية في إصلاح أخطاء فحص واجهة التطبيق الثنائية (ABI). ما عليك سوى تشغيل أداة الإصلاح باستخدام Android.bp / Android.mk كإدخال، وستطبع أداة الإصلاح القيمة المقترَحة إصلاحه إلى stdout. يمكنك اختياريًا تشغيل أداة الإصلاح باستخدام الخيار --in-place من أجل تحديث Android.bp / Android.mk مباشرةً باستخدام الإصلاح المقترَح.

بالنسبة إلى Android.bp،

m fix_android_bp_prebuilt
# Print the fixed Android.bp to stdout.
fix_android_bp_prebuilt <path-to-Android.bp>
# Update the Android.bp in place.
fix_android_bp_prebuilt --in-place <path-to-Android.bp>

بالنسبة إلى Android.mk،

m fix_android_mk_prebuilt
# Print the fixed Android.mk to stdout.
fix_android_mk_prebuilt <path-to-Android.mk>
# Update the Android.mk in place.
fix_android_mk_prebuilt --in-place <path-to-Android.mk>