עבודה עם רשימות של סמלים

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

  • שליחת עדכון של רשימת הסמלים ל-ACK.