ספריות משותפות של אנדרואיד מתפתחות מעת לעת. שמירה על עדכניות של קבצים בינאריים שנבנו מראש דורשת מאמצים רבים. באנדרואיד 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
הפעל את הבודק
כדי להפעיל את הבודק, הגדר את משתנה הסביבה 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
פריטים מוקדמים נבדקים אוטומטית במהלך תהליך הבנייה של אנדרואיד:
make