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

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

בדיקת שימושים של ממשקי ABI שמבוססים על סמלים

הכלי לבדיקת שימושים ב-ABI שמבוסס על סמלים מחקה את ה-linker הדינמי של 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>