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