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