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

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