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

  3. מוסיפים את אותה קבוצה של קובצי KO משלב 2, שממוינים בסדר עולה לחיפוש בינארי בזמן ריצה, אל common/android/gki_{ARCH}_protected_modules כדי לסמן את המודול כמודול GKI מוגן. מעדכנים את רשימת הייצוא המוגנים כך שתכלול את הייצוא מהמודול החדש שנוסף בקובץ common/android/abi_gki_protected_exports_{ARCH} באמצעות הערך tools/bazel run //common:kernel_aarch64_abi_update_protected_exports עבור aarch64. מודולים שמוגדרים כמודולים מוגנים של GKI עדיין צריכים לקבל אישור מ-Google כמודולים רשמיים מוגנים.

  4. מוודאים שקובצי ה-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 ב-build של הפלטפורמה.

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

  3. מוסיפים את אותה קבוצה של קובצי KO משלב 2, שממוינים בסדר עולה לחיפוש בינארי בזמן ריצה, אל common/android/gki_{ARCH}_protected_modules כדי לסמן את המודול כמודול GKI מוגן. מעדכנים את רשימת הייצוא המוגנים כך שתכלול את הייצוא מהמודול החדש שנוסף בקובץ common/android/abi_gki_protected_exports_{ARCH} באמצעות הערך tools/bazel run //common:kernel_aarch64_abi_update_protected_exports עבור aarch64. מודולים שסווגו כמודולים מוגנים של GKI עדיין צריכים לקבל אישור מ-Google כדי להיחשב כמודולים מוגנים רשמיים.

  4. מוודאים שקובצי ה-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 ב-build של הפלטפורמה.

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

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

  1. מסירים את המודול שרוצים להפוך ממוגן ללא מוגן מרשימת המודולים המוגנים בקובץ common/android/gki_protected_modules.

  2. מעדכנים את רשימת הייצוא המוגן כך שתחרוג מהייצוא של המודול הלא מוגן שהומר לאחרונה ב-common/android/abi_gki_protected_exports_{ARCH} באמצעות tools/bazel run //common:kernel_aarch64_abi_update_protected_exports במקום aarch64.

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

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

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

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

שגיאה:

module: Protected symbol: some_kernel_function (err -13)

הסיבה:

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

פתרון:

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

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

שגיאה:

module: exports protected symbol some_kernel_function

הסיבה:

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

פתרון:

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