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

  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‏ (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 של common/modules.bzl. מוסיפים את הקבצים בסדר ממוין. אם אתם לא בטוחים לגבי כל הקבצים שנוצרו, הבנייה תיכשל ויופיעו כל קובצי ה-KO שצריך להוסיף לרשימה.

  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 (ACK), צריך לפעול לפי ההנחיות האחרות.

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

  1. ב-Android מגרסה 15 ואילך, מוסיפים את המודול שממיר ממוגן ללא מוגן לרשימה COMMON_UNPROTECTED_MODULES_LIST בקובץ 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.