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