הספריות המשותפות של 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. אופציונלי: אפשר להריץ את ה-fixer עם האפשרות --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>