ספריות 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>