בודק מובנה לשימוש ב-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_NEEDED שמתועדים בקובץ הבינארי שנוצר מראש.DT_SONAME אם יש אי-התאמה, תוצג הודעת שגיאה.

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

הרצת הבודק

כדי להריץ את הבודק, מגדירים את משתנה הסביבה CHECK_ELF_FILES לערך true ומריצים את make check-elf-files:

CHECK_ELF_FILES=true make check-elf-files

כדי להפעיל את הבודק כברירת מחדל, מוסיפים את PRODUCT_CHECK_ELF_FILES ל-BoardConfig.mk:

PRODUCT_CHECK_ELF_FILES := true

גרסת build מוכנה מראש נבדקת באופן אוטומטי במהלך תהליך ה-build של Android:

make