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

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