พาร์ติชัน DLKM ของผู้ให้บริการและ ODM

Android 11 ขอแนะนำแนวคิดเรื่อง Generic Kernel Image และพาร์ติชันการบูตของผู้ให้บริการ พาร์ติชันการบูตของผู้ให้บริการจะจัดเก็บโมดูลเคอร์เนลที่เข้ากันได้กับ GKI และโหลดโดย init ระยะแรก โมดูลเคอร์เนลก่อนการเปิดตัว 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 มีกระบวนการคล้ายกับการสร้างพาร์ติชันแบบไดนามิกอื่นๆ

ตัวอย่างการสร้าง 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 และ Virtual A/B, device.mk

AB_OTA_PARTITIONS += vendor_dlkm

fstab

เพิ่มรายการต่อไปนี้สำหรับ vendor_dlkm ลงใน fstab เปลี่ยนแฟล็กตามอุปกรณ์ ใช้ CL เพิ่ม vendor_dlkm ลงใน CF เป็นตัวอย่าง

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

ตัวอย่างการสร้าง 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 และ Virtual A/B, device.mk

AB_OTA_PARTITIONS += odm_dlkm

fstab

เพิ่มรายการต่อไปนี้สำหรับ odm_dlkm ลงใน fstab เปลี่ยนแฟล็กตามอุปกรณ์ ใช้ CL เพิ่ม odm_dlkm ลงใน 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

เมื่อเวลาบิลด์ โมดูลที่ระบุไว้ใน BOARD_VENDOR_KERNEL_MODULES จะได้รับการติดตั้งใน $ANDROID_PRODUCT_OUT/vendor_dlkm/lib/modules ระบบจะสร้างลิงก์สัญลักษณ์ที่ /vendor/lib/modules ซึ่งนำไปสู่ /vendor_dlkm/lib/modules

ในทำนองเดียวกัน หากต้องการเลือกโมดูลเคอร์เนลที่ต้องการคัดลอกลงในพาร์ติชัน odm_dlkm ให้ระบุโมดูลเหล่านั้นใน BOARD_ODM_KERNEL_MODULES การสร้างแพลตฟอร์มจะเรียกใช้ depmod ในโมดูลและคัดลอกไฟล์เอาต์พุต depmod ลงในอิมเมจ การสร้างจะสร้างไฟล์ modules.load และจัดเก็บไว้ในอิมเมจ ไฟล์นี้มีโมดูลทั้งหมดที่ระบุไว้ใน BOARD_ODM_KERNEL_MODULES

หากต้องการลบล้างเนื้อหาของ modules.load คุณสามารถระบุได้ใน BOARD_ODM_KERNEL_MODULES_LOAD

เวลาบิลด์ โมดูลที่ระบุไว้ใน 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 ตามลำดับ เมื่อเกิดเหตุการณ์นี้ ลิงก์สัญลักษณ์ที่ /vendor/lib/modules และ /odm/lib/modules จะพร้อมใช้งาน

จากนั้นกระบวนการของผู้ให้บริการ (เช่น สคริปต์ .rc) จะโหลดโมดูลเคอร์เนลตามลำดับที่ระบุไว้ใน modules.load กระบวนการของผู้ให้บริการยังโหลดโมดูลในภายหลังได้ด้วย หากจำเป็น

ดูเอกสารประกอบเกี่ยวกับการสร้างพาร์ติชันการบูตของผู้ให้บริการ (ซึ่ง มี RAMDisk ของผู้ให้บริการ) ได้ที่ การสนับสนุนโมดูล เคอร์เนล