בודק מובנה לשימוש ב-ABI

הספריות המשותפות ב-Android מתפתחות מדי פעם. שמירה של קבצים בינאריים מוכנים מראש עדכניים מחייבים מאמץ רב. ב-Android מגרסה 9 או לפני כן, את הקבצים הבינאריים המוגדרים מראש שתלויים בספריות או בממשקי ABI שהוסרו בלבד. הקישור נכשל בזמן הריצה. המפתחים צריכים לעקוב אחרי היומנים כדי למצוא את קבצים בינאריים מוכנים מראש. ב-Android 10 הושק בודק לשימוש ב-ABI שמבוסס על סמלים. הבודק יכול לזהות קבצים בינאריים מיושנים מראש שנוצרו מראש בזמן ה-build, כדי שמפתחי ספרייה משותפת יוכלו לדעת אילו קבצים בינאריים עשויים להיפגע בעקבות השינוי שלהם, ואילו קבצים בינאריים מוכנים מראש חייבים נבנה מחדש.

בודק שימושים ב-ABI מבוסס סמלים

בודק השימושים ב-ABI מבוסס-סמלים אמולציה של המקשר הדינמי של Android במארח. הבודק מקשר את קובץ הבינארי שנוצר מראש לבין יחסי התלות של קובץ הבינארי שנוצר מראש, ובודק אם כל הסמלים שלא מוגדרים נפתרים.

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