تتطور المكتبات المشتركة في Android من حين لآخر. الاحتفاظ بالبرامج الثنائية التي تم إنشاؤها مسبقًا محدثة جهدًا كبيرًا. في Android 9 أو أقدم، البرامج الثنائية التي تم إنشاؤها مسبقًا والتي تعتمد على المكتبات التي تمت إزالتها أو واجهات التطبيق الثنائية (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
تشغيل أداة التحقّق
لتشغيل أداة المدقق، اضبط متغير البيئة
من CHECK_ELF_FILES
إلى true
والركض
make check-elf-files
:
CHECK_ELF_FILES=true make check-elf-files
لتفعيل ميزة التحقّق تلقائيًا، يمكنك إضافة PRODUCT_CHECK_ELF_FILES
.
إلى BoardConfig.mk
:
PRODUCT_CHECK_ELF_FILES := true
يتم التحقّق من الإعدادات المسبقة الإنشاء تلقائيًا أثناء عملية تصميم Android:
make