כדי לצמצם את שטח הפנים של הסמלים והסוגים שצריך לשמור על יציבותם, לליבת GKI יש יכולות להגביל את הסמלים המיוצאים רק לאלה שנדרשים על ידי מודולים. במודולים שעברו קומפילציה חיצונית, צריך שתהיה רשימה של סמלים בשימוש כדי לאפשר ייצוא שלהם על ידי ליבת ה-GKI. לדוגמה, סמלים שמשמשים מודולים של Cuttlefish מאוחסנים ב-gki/aarch64/symbols/virtual_device
.
הוספת יעד ליצירת רשימת הסמלים
רשימות הסמלים נוצרות על ידי יעד kernel_abi
. מוסיפים את יעד ההמרה הזה למכשיר BUILD.bazel
באמצעות האפשרויות הבאות:
name
הפורמט הנדרש הוא:
<kernel_build>_abi
.kernel_build
צריך להכיל את שם מכשיר היעד
kernel_build
.
אפשר גם להשתמש באפשרויות הבאות:
kernel_modules
רשימה של יעדים למודולים out-of-tree. אין לכלול כאן מודולים בתוך העץ. אפשר לעיין במאמר בנושא הכנת מודולים בתוך העץ לחילוץ סמלים.
kmi_symbol_list_add_only
האפשרות הזו מונעת את ההסרה של סמלים שלא נעשה בהם שימוש. אפשר להסיר סמלים רק בזמנים ספציפיים במהלך הייצוב של KMI, ואי אפשר לעשות זאת אחרי ש-KMI קפוא.
האפשרות הזו שימושית גם כשמשתמשים באותה רשימת סמלים בכמה מכשירים שונים. כך לא יוסרו סמלים שמשמשים במכשיר א' אבל לא במכשיר ב'.
module_grouping
אם
True
או לא צוין, אז רשימת הסמלים מקבצת סמלים על סמך מודולי הליבה שמפנים לסמל. אחרת, רשימת הסמלים היא רשימה ממוינת של סמלים שמשמשים את כל מודולי הליבה.
לדוגמה, ראו את common-modules/virtual-device/BUILD.bazel
:
kernel_abi(
name = "virtual_device_aarch64_abi",
kernel_build = ":virtual_device_aarch64",
kernel_modules = [":virtual_device_aarch64_external_modules"],
kmi_symbol_list_add_only = True,
)
אפשר גם לעיין במאמרי העזרה בנושא היעד kernel_abi
ב-Kleaf.
הכנה של מודולים בתוך העץ לחילוץ סמלים
כדי להכין מודולים בתוך העץ לחילוץ סמלים, צריך לרשום מודולים בתוך העץ שספציפיים לספק במאפיין module_outs
של יעד kernel_build
. _VIRT_COMMON_MODULES
ודוגמה לשימוש אל תכללו ברשימה הזו מודולים של GKI.
צריך להגדיר את המודולים האלה כלא חתומים, אחרת רשימת הסמלים עשויה להיות ריקה. כדי לעשות זאת, מוסיפים את השורה הזו לקטעי ההגדרות של ליבת המערכת:
# CONFIG_MODULE_SIG_ALL is not set
לדוגמה, ראו
common-modules/virtual-device/virtual_device_core.fragment
.
הוספת רשימת סמלים של מכשיר ל-build של ליבת המכשיר
מוסיפים את מאפיין kmi_symbol_list
ליעד kernel_build
שמוגדר במכשיר BUILD.bazel
. שם רשימת הסמלים צריך להיות בפורמט
//common:gki/<arch>/symbols/<device>
.
דוגמה:
common-modules/virtual-device/BUILD.bazel
,
kernel_build(
name = "virtual_device_aarch64",
base_kernel = "//common:kernel_aarch64",
kmi_symbol_list = "//common:gki/aarch64/symbols/virtual_device",
...
module_outs = _VIRT_COMMON_MODULES + _VIRT_AARCH64_MODULES,
)
יצירה ושליחה של רשימת סמלים ראשונית
תצור רשימה ריקה של סמלים בcommon/gki/<arch>/symbols/<device>
. בדוגמה שלמעלה, הפקודה תהיה:
touch common/gki/aarch64/symbols/virtual_device
מוסיפים את הקובץ הזה אל additional_kmi_symbol_lists
של גרסת הבסיס של ליבת GKI. לדוגמה, //common:gki/aarch64/symbols/virtual_device
נוסף לקבוצת הקבצים aarch64_additional_kmi_symbol_lists
, שמוצהרת ב-common/BUILD.bazel
.
מעדכנים את רשימת הסמלים של המכשירים כדי למלא את רשימת הסמלים החדשה ושולחים אותה למאגר של ליבת Android Common.
עדכון רשימת סמלי מכשירים
כל הסמלים של ליבת הקרנל שנעשה בהם שימוש במודולים ב-module_outs
של kernel_build
וב-kernel_modules
של kernel_abi
צריכים להיכלל ברשימת הסמלים. כדי לעשות זאת, מריצים את היעד kernel_abi
עם הסיומת _update_symbol_list
. לדוגמה, הפקודה הבאה מעדכנת את רשימת הסמלים של //common-modules/virtual-device:virtual_device_aarch64
:
tools/bazel run //common-modules/virtual-device:virtual_device_aarch64_abi_update_symbol_list
שליחת עדכון של רשימת סמלים ל-ACK
שולחים תיקון עם השינוי ברשימת הסמלים אל Android Common Kernel gerrit כדי שהסמלים החדשים יהיו חלק מ-KMI.
הודעת השמירה צריכה לכלול רשימה של סמלים שנוספו או הוסרו. אפשר לכתוב את הרשימה הזו באופן ידני אם רוצים לעדכן רשימה קטנה של סמלים, או להשתמש ב$DIST_DIR/abi_stgdiff/abi.report.short
דוח אחרי עדכון הייצוג של ה-ABI של ההפניה.
עדכון הייצוג של ה-ABI של ההפניה לפני שליחת עדכון של רשימת סמלים הוא לא חובה, אבל הוא יכול למנוע שלבים נוספים לפני השליחה ולזרז את מוכנות השינוי לשליחה. בכל מקרה, הוא נבדק ומעודכן אם צריך במהלך בדיקת הקוד לפני השליחה.
עבודה עם רשימות של סמלים (Android 13)
Android 13 תומך גם ב-Kleaf וגם בסקריפטים ישנים של build, כך שאפשר לנהל רשימות של סמלים כמו שמתואר בקטעים הקודמים או כמו שמתואר בקטע הבא.
עבודה עם רשימות של סמלים (Android מגרסה 12 ומטה)
משתמשים בכלי build_abi.sh
באופן הבא:
BUILD_CONFIG=path/to/build.config.device build/build_abi.sh --update-symbol-list
בדוגמה הזו, build.config.device
צריך לכלול את אפשרויות ההגדרה הבאות:
vmlinux
הערך חייב להיות חלק מהרשימה
FILES
. כדי לעשות זאת, אפשר להוסיף את התוכן הבא:build.config.aarch64
.KMI_SYMBOL_LIST
צריך להגדיר את המשתנה כך שיצביע על רשימת הסמלים של KMI כדי לעדכן.
אחרי שמעדכנים את רשימת הסמלים של המכשיר, צריך גם לשקף את השינויים האלה ב-GKI build (common/build.config.gki.aarch64
):
מעתיקים את רשימת הסמלים המעודכנת אל
common/android/abi_gki_aarch64_<device>
.בודקים ש-
android/abi_gki_aarch64_<device>
נכלל ב-ADDITIONAL_KMI_SYMBOL_LISTS
ב-common/build.config.gki.aarch64
.