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