تتطوّر مكتبات 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>