ספריות משותפות של אנדרואיד מתפתחות מעת לעת. שמירה על עדכניות של קבצים בינאריים שנבנו מראש דורשת מאמץ ניכר. באנדרואיד 9 ואילך, הקבצים הבינאריים המובנים מראש התלויים בספריות שהוסרו או ABIs לא מצליחים לקשר רק בזמן הריצה. מפתחים צריכים להתחקות אחר היומנים כדי למצוא את הקבצים הבינאריים המיושנים מראש. באנדרואיד 10, מוצג בודק שימושים ABI מבוסס סמלים. הבודק יכול לזהות בינאריים מיושנים שנבנו מראש בזמן הבנייה, כך שמפתחי ספרייה משותפת יכולים לדעת אילו קבצים בינאריים שנבנו מראש עלולים להישבר על ידי השינוי שלהם ואילו בינאריים שנבנו מראש חייבים להיבנות מחדש.
בודק שימושים ABI מבוסס סמלים
בודק השימושים ABI מבוסס סמלים מחקה את הקישור הדינמי של אנדרואיד במארח. הבודק מקשר את הבינארי שנבנה מראש עם התלות של הבינארי שנבנה מראש ובודק אם כל הסמלים הלא מוגדרים נפתרו.
ראשית, הבודק בודק את ארכיטקטורת היעד של הבינארי שנבנה מראש. אם הבינארי שנבנה מראש אינו מכוון לארכיטקטורת ARM, AArch64, x86 או x86-64, הבודק מדלג על הבינארי המובנה מראש.
שנית, התלות של הבינארי שנבנה מראש חייבות להיות רשומות ב- LOCAL_SHARED_LIBRARIES
או shared_libs
. מערכת ה-build פותרת את שמות המודולים לגרסה התואמת (כלומר 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 במהלך תהליך הבנייה של אנדרואיד.
כדי להפעיל את הבודק לבד לזמני אספקה מהירים יותר:
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>