אפשר לעדכן את GKI ואת מודולי GKI בנפרד משאר המחיצה, כי מודולי GKI נמצאים במחיצה דינמית נפרדת בתמונה העל שנקראת system_dlkm. מודולים של GKI נחתמים על ידי Google באמצעות צמד מפתחות של זמן בניית הליבה, והם תואמים רק ל-GKI שבו הם נבנו.
אין יציבות ABI בין GKI לבין מודולי GKI. כדי שהמודולים ייטענו בצורה תקינה במהלך זמן הריצה, צריך לבנות ולעדכן את ה-GKI ואת מודולי ה-GKI יחד.
הטמעה של תמיכה במחיצה system_dklm
המחיצה system_dlkm נמצאת במחיצת העל כמחיצה דינמית נוספת. המחיצה הזו יכולה להכיל:
- מודולי ליבה חתומים בזמן הבנייה של Google
depmodפריטי מידע שנוצרו בתהליך פיתוח (Artifact)
Build system_dlkm
תהליך היצירה של system_dlkm דומה לתהליך היצירה של מחיצות דינמיות אחרות. כדי להוסיף את system_dlkm ל-build:
ב-
BoardConfig.mk, מוסיפים את הרשומות הבאות:BOARD_USES_SYSTEM_DLKMIMAGE := true BOARD_SYSTEM_DLKMIMAGE_FILE_SYSTEM_TYPE := $(TARGET_RO_FILE_SYSTEM_TYPE) TARGET_COPY_OUT_SYSTEM_DLKM := system_dlkmברשימת המחיצות, מוסיפים את
system_dlkm:BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := system_dlkm(אופציונלי) במכשירי A/B ובמכשירי A/B וירטואליים, מוסיפים את השורה הבאה לקובץ
device.mkשל המכשיר:AB_OTA_PARTITIONS += system_dlkm
זיהוי מודולי ליבה להעתקה אל system_dlkm
כדי שהמודולים ייטענו בהצלחה בזמן הריצה, צריך ליצור את GKI ואת מודולי GKI ביחד. לכן, צריך לזהות מודולי ליבה ב-GKI build עבור ארכיטקטורת היעד ולספק אותם כמקור למחיצה system_dlkm במהלך בניית הפלטפורמה.
ל-Android 13
מציינים את BOARD_SYSTEM_DLKM_SRC כתיקייה שמכילה את קובצי האובייקט של ליבת מודולי ה-GKI הנדרשים למכשיר, כקלט למערכת ה-build, כדי ליצור את המחיצה system_dlkm. לדוגמה:
מספקים את המקור של מודולי GKI בתיקייה ומפנים את BOARD_SYSTEM_DLKM_SRC לתיקייה הזו. לדוגמה:
BOARD_SYSTEM_DLKM_SRC := kernel/prebuilts/5.10/arm64/system_dlkm_staging
בזמן הבנייה, המודולים שמפורטים ב-BOARD_SYSTEM_DLKM_SRC מותקנים ב-$ANDROID_PRODUCT_OUT/system_dlkm.
ל-Android 14
ייעלנו את ההטמעה באמצעות פקודות מאקרו (BOARD_*_KERNEL_MODULES) שמשמשות למחיצות אחרות של *_dlkm. רשימת מודולי ה-GKI הנדרשים למכשיר צריכה להיות מופנית באמצעות מאקרו BOARD_SYSTEM_KERNEL_MODULES. בזמן הבנייה, המודולים האלה מותקנים ב-$ANDROID_PRODUCT_OUT/system_dlkm. כל מודול במחיצה vendor_dlkm שיש לו יחסי תלות במודולים במחיצה system_dlkm יוצר הפניות נכונות בקובץ modules.dep למחיצה vendor_dlkm. בגלל התלות בין המחיצות שמיוצגת על ידי modules.dep, כשמודול של ספק נטען, כל מודול GKI נדרש נטען באופן אוטומטי.
לדוגמה, כדי להתקין את כל מודולי ה-GKI במחיצה system_dlkm עבור ליבת GKI arm64 5.15 מ-prebuilts:
BOARD_SYSTEM_KERNEL_MODULES := $(wildcard kernel/prebuilts/5.15/arm64/*.ko)
הוספת תושבת system_dlkm בזמן הריצה
בהתאם למערכת הקבצים שבה משתמשים כמערכת קבצים לקריאה בלבד, מוסיפים את השורות הבאות לקובץ fstab כדי לטעון את המחיצה system_dlkm בזמן הריצה:
ext4 כמערכת קבצים לקריאה בלבד
system_dlkm /system_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb
erofs כמערכת קבצים לקריאה בלבד
system_dlkm /system_dlkm erofs ro wait,logical,first_stage_mount,slotselect,avb
התקנת מחיצה וטעינת מודול
במהלך first_stage_init, המחיצה system_dlkm נטענת ב-/system_dlkm כמערכת קבצים לקריאה בלבד. אם ההרכבה מצליחה, הקישורים הסמליים ב-/system/lib/modules שמפנים אל /system_dlkm/lib/modules זמינים.
תהליך של ספק, כמו סקריפט .rc, יכול לטעון את מודולי הליבה על סמך הסדר שצוין ב-modules.load. בתהליך של הספק צריך להשתמש בקישור הסמלי /system/lib/modules כדי לטעון את המודולים.
במקרה הצורך, תהליך הספק יכול גם לטעון את המודולים בשלב מאוחר יותר.
SELinux
כל קובץ במחיצה system_dlkm מסומן בתווית עם הקשר של הקובץ system_dlkm_file. כדי לטעון את קובץ המודולים של GKI במחיצה system_dlkm, תהליך הספק שאחראי לטעינת המודולים צריך sepolicy בדומיין הספק.
לדוגמה, ל-dlkm_loader שמשמש את Cuttlefish לטעינת מודולים של GKI יש את ההרשאות הבאות בקובץ המדיניות ב-shared/sepolicy/vendor/dlkm_loader.te:
allow dlkm_loader self:capability sys_module;
allow dlkm_loader system_dlkm_file:dir r_dir_perms;
allow dlkm_loader system_dlkm_file:file r_file_perms;
allow dlkm_loader system_dlkm_file:system module_load;
אימות המחיצה system-dlkm
Google מספקת מקרה בדיקה של GKI VTS כדי לאמת את המחיצה system_dlkm. כדי להפעיל את הבדיקה באופן ידני, משתמשים בפקודה atest הבאה:
atest -c vts_dlkm_partition_test