אפשר לעדכן את GKI ואת המודולים של GKI בנפרד משאר המחיצה, כי המודולים של GKI נמצאים במחיצה דינמית נפרדת בסופר-תמונה שנקראת system_dlkm
. המודולים של GKI נחתמים על ידי Google באמצעות זוג מפתחות בזמן בניית ליבה (kernel) ותואמים רק ל-GKI שהם נבנו בעזרתו.
אין יציבות ABI בין מודולים של GKI לבין מודולים של GKI. כדי שהמודולים ייטענו בצורה נכונה במהלך זמן הריצה, צריך ליצור ולעדכן את המודולים של GKI ושל GKI יחד.
הטמעת תמיכה במחיצה system_dklm
המחיצה system_dlkm
נמצאת במחיצה הסופר כמחיצה דינמית נוספת. המחיצה הזו יכולה להכיל:
- מודולים של ליבה בחתימה של Google בזמן ה-build
depmod
פריטי מידע שנוצרו בתהליך פיתוח (Artifact)
Build system_dlkm
תהליך היצירה של system_dlkm
דומה לתהליך היצירה של מחיצות דינמיות אחרות. כדי להוסיף את system_dlkm
לגרסה היציבה:
ב-
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
זיהוי מודולים של ליבה (kernel) להעתקה אל system_dlkm
כדי שהמודולים ייטענו בהצלחה בזמן הריצה, צריך לבנות יחד את המודולים של GKI ו-GKI. לכן צריך לזהות את מודולי הליבה ב-GKI build לארכיטקטורת היעד, ולספק אותם כמקור למחיצה system_dlkm
במהלך ה-build של הפלטפורמה.
ל-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
בזמן ה-build, המודולים שמפורטים ב-BOARD_SYSTEM_DLKM_SRC
מותקנים ב-$ANDROID_PRODUCT_OUT/system_dlkm
.
ל-Android 14
ייעלנו את ההטמעה באמצעות המאקרו (BOARD_*_KERNEL_MODULES
) שמשמש למחיצות *_dlkm
אחרות. צריך להפנות למאקרו BOARD_SYSTEM_KERNEL_MODULES
כדי לקבל את רשימת המודולים הנדרשים של GKI למכשיר. בזמן ה-build, המודולים האלה מותקנים ב-$ANDROID_PRODUCT_OUT/system_dlkm
. כל מודול במחיצה vendor_dlkm
שיש לו יחסי תלות במודולים במחיצה system_dlkm
יוצר הפניות נכונות בקובץ modules.dep
למחיצה vendor_dlkm
. בגלל יחסי התלות בין המחיצות שמוצגים על ידי modules.dep
, כשמודול של ספק נטען, כל מודול GKI נדרש נטען באופן אוטומטי.
לדוגמה, כדי להתקין את כל המודולים של GKI במחיצה system_dlkm
עבור הליבה arm64
של GKI 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