בודק שימושים ABI בנוי מראש

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