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

כדי לצמצם את השטח של סמלים וסוגים שצריך לשמור על יציבות, לליבת GKI יש יכולות להגביל את הסמלים המיוצאים רק לאלה במודולים. למודולים שעברו הידור חיצוני, צריכה להיות לכם רשימה של סמלים בשימוש כדי לאפשר ייצוא שלהם על ידי הליבה של GKI. לדוגמה, סמלים שמשמשים את המודולים דגי ים מאוחסנים באזור android/abi_gki_aarch64_virtual_device.

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

רשימות הסמלים נוצרות על ידי היעד kernel_abi. מוסיפים את היעד הזה מכשיר BUILD.bazel עם האפשרויות הבאות:

  • name

    הוא צריך להיות בפורמט <kernel_build>_abi.

  • kernel_build

    צריך להכיל את שם היעד של kernel_build למכשיר.

אפשר גם להשתמש באפשרויות הבאות:

  • kernel_modules

    רשימת היעדים למודולים מחוץ לעץ. אסור להגדיר מודולים בעץ ייכללו כאן. פרטים נוספים הכינו מודולים של עץ לחילוץ סמלים.

  • kmi_symbol_list_add_only

    האפשרות הזו מונעת הסרה של סמלים שלא בשימוש. הסרת הסמלים מתבצעת רק מותר בשעות ספציפיות במהלך KMI ייצוב ואסור להשתמש בו כשה-KMI קפוא.

    זה שימושי גם כאשר משתמשים באותה רשימת סמלים עבור מספר מכשירים. כך, המכשיר לא יסיר סמלים שמשמשים את מכשיר א' אבל לא את מכשיר ב'.

  • module_grouping

    אם הערך True או לא צוין, הסמלים מקובצים לפי מודולים של ליבה (kernel) שמפנים לסמל. אחרת, רשימת הסמלים רשימה ממוינת של סמלים שמשמשת את כל מודולי הליבה.

צפייה 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 ברשימה הזו.

מגדירים את המודולים האלה unsigned, אחרת, יכול להיות שרשימת הסימנים תהיה ריקה. כדי לעשות זאת, מוסיפים את השורה הזו לליבה (kernel) מקטעי config:

# CONFIG_MODULE_SIG_ALL is not set

צפייה common-Modules/virtual-device/virtual_device_core.section למשל.

הוספת רשימת סמלי מכשירים ל-build של הליבה של המכשיר

מוסיפים את המאפיין kmi_symbol_list ליעד kernel_build שמוגדר ב מכשיר BUILD.bazel. שם רשימת הסמלים צריך להיות בפורמט של //common:android/abi_gki_<arch>_<device> צפייה common-Modules/virtual-device/BUILD.bazel, לדוגמה:

kernel_build(
    name = "virtual_device_aarch64",
    base_kernel = "//common:kernel_aarch64",
    kmi_symbol_list = "//common:android/abi_gki_aarch64_virtual_device",
    ...
    module_outs = _VIRT_COMMON_MODULES + _VIRT_AARCH64_MODULES,
)

יצירה ושליחה של רשימת סמלים ראשונית

אפשר ליצור רשימת סמלים ריקה ב-common/android/abi_gki_<arch>_<device>. עבור הדוגמה שמעל הפקודה תהיה:

touch common/android/abi_gki_aarch64_virtual_device

מוסיפים את הקובץ הזה ל-additional_kmi_symbol_lists של גרסת ה-build הבסיסית של ליבת GKI. עבור לדוגמה, //common:android/abi_gki_aarch64_virtual_device מתווסף קבוצת קבצים אחת (aarch64_additional_kmi_symbol_lists), הוצהרה ב- common/BUILD.bazel.

מעדכנים את רשימת הסמלים של המכשירים כך שתמלא את רשימת הסמלים החדשה. שולחים אותו למאגר הליבה של Android Common Kernel.

עדכון רשימת סמלים של מכשירים

כל סמלי הליבה של הליבה שמשמשים במודולים ב-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) להפוך את הסמלים החדשים לחלק מ-KMI.

הודעת ההצהרה צריכה לכלול רשימה של סמלים שנוספו או הוסרו. אפשר לכתוב את הרשימה באופן ידני לעדכון של רשימת סמלים קטנה או להשתמש דיווח אחד ($DIST_DIR/abi.report.short) אחרי עדכון ה-ABI של ההפניה של מודל טרנספורמר.

בזמן עדכון ה-ABI של ההפניה ייצוג לפני שליחת עדכון של רשימת סמלים, הוא עשוי לבטל את השלבים שצריך להגיש מראש כדי שניתן יהיה לשלוח את השינוי מהר יותר. בכל מקרה, בוצעה בדיקה ועדכון לפי הצורך במהלך השליחה מראש.

גרסאות ישנות יותר (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 כדי לעדכן.

אחרי שמעדכנים את רשימת סמלי המכשירים, צריך לשקף את השינויים האלה גם גרסת ה-build של GKI (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.