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