הגדרת תכונות הליבה כמודולים של GKI

בדף הזה מוסבר איך להגדיר תכונת ליבה חדשה כמודול GKI או להגדיר תכונת ליבה מוטמעת קיימת כמודול GKI.

הגדרת תכונה חדשה כמודול GKI

  1. כדי להשתמש בתכונה החדשה, צריך לערוך את gki_defconfig ולהגדיר את פריט ההגדרה של תכונת הליבה הנדרשת מ-n ל-m (=m). צריך להגדיר את ההגדרה הזו גם ב-arch/arm64/configs/gki_defconfig וגם ב-arch/x86/configs/gki_defconfig.

  2. מוסיפים את הקבצים של KO (.ko) שנוצרו לתכונה לקטע _COMMON_GKI_MODULES_LIST בקובץ הבא. מוסיפים את הקבצים בסדר ממוין. אם אתם לא בטוחים לגבי כל הקבצים שנוצרו, הבנייה תיכשל ויוצגו כל קובצי ה-KO שצריך להוסיף לרשימה.

    • ב-android17-6.18 ומעלה, מוסיפים פריטים ל-common/bazel/modules_private.bzl.
    • ב-android16-6.12 ובגרסאות קודמות, מוסיפים פריטים ל-common/modules.bzl.
  3. ב-Android 14, מוסיפים את אותה קבוצה של קובצי KO משלב 2, ממוינים בסדר עולה לחיפוש בינארי בזמן ריצה, אל common/android/gki_{ARCH}_protected_modules כדי לציין את המודול כמודול GKI מוגן.

  4. ב-Android 14 וב-Android 15, צריך לעדכן את רשימת הייצוא כך שתכלול את הייצוא החדש שנוסף ב-common/android/abi_gki_protected_exports_ARCHITECTURE. לדוגמה, כדי לעדכן את הרשימה, מריצים את הפקודה tools/bazel run //common:kernel_aarch64_abi_update_protected_exports עבור aarch64.

  5. מוודאים שקבצי ה-KO החדשים שהוספתם בשלב 2 מועתקים ל-out/<androidX-Y.Z>/dist/system_dlkm.img ול-out/androidX-Y.Z/dist/system_dlkm_staging_archive.tar.gz של הליבה. אפשר להשתמש במודולים בארכיון system_dlkm_staging_archive.tar.gz כקלט ליצירת system_dlkm.img בגרסת הפלטפורמה.

  6. שולחים את השינויים לבדיקה. מודולים של GKI הם תכונה של ליבת Android בלבד, ולכן אין צורך לשלוח תיקונים להמרת מודולים ל-upstream. עם זאת, יש הנחיות אחרות שצריך לפעול לפיהן כדי לשלוח תיקונים ל-Android Common Kernel (ACK).

הגדרת תכונה מובנית בקרנל כמודול GKI

  1. כדי להשתמש בתכונה מובנית קיימת של ליבת מערכת ההפעלה, עורכים את gki_defconfig ומגדירים את פריט ההגדרה של התכונה הנדרשת של ליבת מערכת ההפעלה מ-y ל-m (=m). מגדירים את ההגדרה הזו גם ב-arch/arm64/configs/gki_defconfig וגם ב-arch/x86/configs/gki_defconfig.

  2. מוסיפים את קובצי ה-KO (.ko) שנוצרו לתכונה לקטע _COMMON_GKI_MODULES_LIST בקובץ הבא. מוסיפים את הקבצים בסדר ממוין. אם אתם לא בטוחים לגבי כל הקבצים שנוצרו, הבנייה תיכשל ויוצגו כל קובצי ה-KO שצריך להוסיף לרשימה.

    • ב-android17-6.18 ומעלה, מוסיפים פריטים ל-common/bazel/modules_private.bzl.
    • ב-android16-6.12 ומטה, מוסיפים פריטים ל-common/modules.bzl.
  3. ב-Android 14, מוסיפים את אותה קבוצה של קובצי KO משלב 2, ממוינים בסדר עולה לחיפוש בינארי בזמן ריצה, אל common/android/gki_{ARCH}_protected_modules כדי לציין את המודול כמודול GKI מוגן.

  4. ב-Android 14 וב-Android 15, צריך לעדכן את רשימת הייצוא המוגנים כדי לכלול ייצוא מהמודול החדש שנוסף ב-common/android/abi_gki_protected_exports_{ARCH} באמצעות tools/bazel run //common:kernel_aarch64_abi_update_protected_exports עבור aarch64.

  5. מוודאים שקבצי ה-KO של המודול שהומרו בשלב 2 מועתקים אל out/<androidX-Y.Z>/dist/system_dlkm.img ו-out/androidX-Y.Z/dist/system_dlkm_staging_archive.tar.gz של ליבת המערכת. אפשר להשתמש במודולים בארכיון system_dlkm_staging_archive.tar.gz כקלט ליצירת system_dlkm.img בגרסת הפלטפורמה.

  6. שולחים את השינויים לבדיקה. מודולים של GKI הם תכונה של ליבת Android בלבד, ולכן אין צורך לשלוח תיקונים להמרת מודולים ל-upstream. עם זאת, כדי לשלוח תיקונים ל-Android Common Kernel (ACK), צריך לפעול לפי ההנחיות האחרות.

המרת מודול GKI מוגן ללא מוגן

  1. ב-Android מגרסה 15 ואילך, מוסיפים את המודול שמומר ממוגן ללא מוגן לרשימה _COMMON_UNPROTECTED_MODULES_LIST בקובץ הבא:

    • ב-android17-6.18 ומעלה, מוסיפים פריטים ל-common/bazel/modules_private.bzl.
    • ב-android16-6.12 ובגרסאות קודמות, מוסיפים פריטים ל-common/modules.bzl.
  2. ב-Android 14, מסירים את המודול שממיר ממוגן ללא מוגן מרשימת המודולים המוגנים בכתובת common/android/gki_protected_modules.

  3. ב-Android 14 וב-Android 15, צריך לעדכן את רשימת היצוא המוגן כדי להחריג את היצוא מהמודול החדש שהומר ולא מוגן ב-common/android/abi_gki_protected_exports_{ARCH} באמצעות tools/bazel run //common:kernel_aarch64_abi_update_protected_exports עבור aarch64.

  4. שולחים את השינויים לבדיקה. מודולים של GKI הם תכונה של ליבת Android בלבד, ולכן אין צורך לשלוח תיקונים להמרת מודולים ל-upstream. עם זאת, כדי לשלוח תיקונים לליבה המשותפת של Android‏ (ACK), צריך לפעול לפי ההנחיות האחרות.

מדריך מהיר לפתרון הפרות של סמלים במודולים של GKI

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

1. מודול לא חתום באמצעות הסמל המוגן

שגיאה:

module: Protected symbol: some_kernel_function (err -13)

הסיבה:

קובץ module.ko הוא מודול ספק לא חתום, והוא מנסה לפתור את הסמל המיוצא של מודול GKI‏ some_kernel_function במהלך הטעינה, בלי שהוא מופיע ברשימת סמלי הספק.

פתרון:

אם module.ko הוא לא מודול GKI מוגן, עדכון רשימת הסמלים פותר את השגיאה על ידי הכללת some_kernel_function ברשימת הסמלים של הספק. אפשר גם להשתמש בגרסת GKI של module.ko.

2. מודול לא חתום שמייצא את הסמל המוגן

שגיאה:

module: exports protected symbol some_kernel_function

הסיבה:

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

פתרון:

אפשר לתקן את זה באמצעות גרסת GKI של המודול שמייצאת את some_kernel_function, אם המודול הלא חתום הוא גרסה בהתאמה אישית.