מחיצות DLKM של ספקים ו-ODM

ב-Android 11 מוצגים המושגים 'Generic Kernel Image' ו'מחיצה לאתחול של הספק'. במחיצה של אתחול הספק מאוחסנים מודולים של ליבה שתואמים ל-GKI, והיא נטענת על ידי init בשלב הראשון. מודולים של ליבה (kernel) שפורסמו לפני Android 11 מאוחסנים גם במחיצות של ספקים ו-ODM, ונטענים על ידי תהליכים של ספקים.

ב-Android מגרסה 11 ואילך, אפשר לעדכן את הליבה ואת כל המודולים שלה בנפרד משאר המחיצות. כדי לאפשר עדכונים של מודולי הליבה שמאוחסנים במחיצה של הספק (ללא עדכון של מחיצה של הספק), מעבירים את כל המודולים של מחיצה של הספק למחיצה חדשה שנקראת Vendor DLKM (מודול ליבה שניתן לטעינה באופן דינמי). לאחר מכן תוכלו לעדכן את המחיצה הזו בנפרד. באופן דומה, אפשר להעביר את כל המודולים של הליבה שמאוחסנים במחיצה של ODM למחיצה חדשה שנקראת ODM DLKM. אפשר גם לעדכן את המחיצה הזו בנפרד.

מיקום המחיצה

המחיצות vendor_dlkm ו-odm_dlkm נמצאות במחיצה הסופר כמחיצה דינמית נוספת.

תוכן vendor_dlkm בקטע /vendor/lib/modules

  • מודולים של ליבה של ספקים
  • modprobe קובצי תצורה
  • קובץ modules.load

התוכן של odm_dlkm ב-‎ /odm/lib/modules

  • מודולים של ליבה של ODM
  • modprobe קובצי תצורה
  • קובץ modules.load

מידע נוסף על קובצי תצורה של מודול ליבה זמין במאמר תמיכה במודול ליבה.

בניית תמיכה

תהליך היצירה של vendor_dlkm ו-odm_dlkm דומה לתהליך היצירה של מחיצות דינמיות אחרות.

דוגמה ל-build של vendor_dlkm

יוצרים את vendor_dlkm כפי שמתואר בדוגמאות הבאות.

BoardConfig.mk

BOARD_USES_VENDOR_DLKMIMAGE := true
BOARD_VENDOR_DLKMIMAGE_FILE_SYSTEM_TYPE := ext4
TARGET_COPY_OUT_VENDOR_DLKM := vendor_dlkm
BOARD_<GROUP_NAME>_PARTITION_LIST += vendor_dlkm

מחליפים את <GROUP_NAME> בשם המתאים של קבוצת העדכונים. קבוצת העדכון צריכה להיות הקבוצה שבה נמצא המחיצה של הספק.

במכשירי A/B ובמכשירי A/B וירטואליים, device.mk

AB_OTA_PARTITIONS += vendor_dlkm

fstab

מוסיפים את הרשומה הבאה עבור vendor_dlkm לקובץ fstab. משנים את הדגלים בהתאם למכשיר. לדוגמה, אפשר להשתמש ב-CL Add vendor_dlkm to CF.

vendor_dlkm /vendor_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb

דוגמה ל-build של odm_dlkm

יוצרים את odm_dlkm כפי שמתואר בדוגמאות הבאות.

BoardConfig.mk

BOARD_USES_ODM_DLKIMAGE := true
BOARD_ODM_DLKIMAGE_FILE_SYSTEM_TYPE := ext4
TARGET_COPY_OUT_ODM_DLKM := odm_dlkm
BOARD_<group_name>_PARTITION_LIST += odm_dlkm

במכשירים עם בדיקות A/B ובמכשירים וירטואליים עם בדיקות A/B, device.mk

AB_OTA_PARTITIONS += odm_dlkm

fstab

מוסיפים את הרשומה הבאה עבור odm_dlkm לקובץ fstab. משנים את הדגלים בהתאם למכשיר. לדוגמה, אפשר להשתמש ב-CL Add odm_dlkm to CF.

odm_dlkm /odm_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb

העתקת מודולים של ליבה למחיצה

כדי לבחור את מודולי הליבה שרוצים להעתיק למחיצה vendor_dlkm, צריך לרשום אותם ב-BOARD_VENDOR_KERNEL_MODULES.

אם רוצים לשנות את התוכן של modules.load, אפשר לציין אותו ב-BOARD_VENDOR_KERNEL_MODULES_LOAD.

בזמן ה-build, המודולים שמפורטים ב-BOARD_VENDOR_KERNEL_MODULES מותקנים ב-$ANDROID_PRODUCT_OUT/vendor_dlkm/lib/modules. נוצר קישור סימבולי ב-/vendor/lib/modules שמוביל אל /vendor_dlkm/lib/modules.

באופן דומה, כדי לבחור את מודולי הליבה שרוצים להעתיק למחיצה odm_dlkm, צריך לרשום אותם ב-BOARD_ODM_KERNEL_MODULES. ה-build של הפלטפורמה מפעיל את depmod במודולים ומעתיק את קובצי הפלט של depmod לאימג'. תהליך ה-build יוצר קובץ modules.load ושומר אותו בתמונה. הקובץ הזה מכיל את כל המודולים שמפורטים ב-BOARD_ODM_KERNEL_MODULES.

אם רוצים לשנות את התוכן של modules.load, אפשר לציין אותו ב-BOARD_ODM_KERNEL_MODULES_LOAD.

בזמן ה-build, המודולים שמפורטים ב-BOARD_ODM_KERNEL_MODULES מותקנים ב-$ANDROID_PRODUCT_OUT/odm_dlkm/lib/modules. נוצר קישור סימבולי ב-/odm/lib/modules שמוביל אל /odm_dlkm/lib/modules.

תמיד צריך להשתמש ב-/vendor/lib/modules וב-/odm/lib/modules במודולים של ליבה של ספקים ו-ODM.

אף פעם אל תשתמשו ב-/vendor_dlkm/lib/modules. במכשירים ללא מחיצה vendor_dlkm, BOARD_VENDOR_KERNEL_MODULES מותקן ישירות ב-/vendor/lib/modules. זו בעיה כי השדה /vendor_dlkm/lib/modules לא קיים.

אף פעם אל תשתמשו ב-/odm_dlkm/lib/modules. במכשירים ללא מחיצת odm_dlkm, BOARD_ODM_KERNEL_MODULES מותקן ישירות ב-/odm/lib/modules. זה בעייתי כי הערך /odm_dlkm/lib/modules לא קיים.

חיבור מחיצות וטעינה של מודולים

במהלך first_stage_init, המחיצות vendor_dlkm ו-odm_dlkm מותקנות בספריות /vendor_dlkm ו-/odm_dlkm, בהתאמה. במקרה כזה, קישורי ה-symlink ב-/vendor/lib/modules וב-/odm/lib/modules יהיו זמינים.

לאחר מכן, תהליך של ספק (כמו סקריפט .rc) יכול לטעון את מודולי הליבה לפי הסדר שצוין ב-modules.load. תהליך הספק יכול גם לטעון את המודולים בשלב מאוחר יותר, אם יש צורך.

למסמכי עזרה בנושא יצירת מחיצה של טעינה של יצרן (שמכילה את ה-RAMDisk של היצרן), אפשר לעיין במאמר Kernel Module Support.