تتطور المكتبات المشتركة في 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>