ใช้พาร์ติชันโมดูล GKI

อัปเดตโมดูล GKI และ GKI ได้อย่างอิสระจากพาร์ติชันส่วนที่เหลือ เนื่องจากโมดูล GKI อยู่ในพาร์ติชันแบบไดนามิกที่แยกต่างหากในซูเปอร์อิมเมจ ที่ชื่อ system_dlkm Google รับรองโมดูล GKI โดยใช้เคอร์เนล คู่คีย์เวลาบิลด์และใช้งานได้กับ GKI ที่สร้างมาด้วยเท่านั้น โมดูล GKI และ GKI จะไม่มีความเสถียรของ ABI สำหรับโมดูลที่จะโหลด อย่างถูกต้องในระหว่างรันไทม์ โมดูล GKI และ GKI ต้องสร้างและอัปเดต

ใช้การรองรับพาร์ติชัน system_dklm

พาร์ติชัน system_dlkm อยู่ในซูเปอร์พาร์ติชันเป็นไดนามิกอื่น พาร์ติชัน พาร์ติชันนี้มีสิ่งต่อไปนี้ได้

  • โมดูลเคอร์เนลที่รับรองเวลาบิลด์ของ Google
  • อาร์ติแฟกต์ depmod รายการ

บิลด์ system_dlkm

การสร้าง system_dlkm เป็นกระบวนการที่คล้ายกับการสร้างไดนามิกอื่นๆ พาร์ติชัน ทำตามขั้นตอนต่อไปนี้เพื่อเพิ่ม system_dlkm ไปยังบิลด์

  1. ใน 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
    
  2. เพิ่ม system_dlkm ในรายการพาร์ติชัน BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := system_dlkm

  3. (ไม่บังคับ) สำหรับอุปกรณ์ A/B และ A/B เสมือน ให้เพิ่มบรรทัดต่อไปนี้ใน device.mk ไฟล์สำหรับอุปกรณ์ของคุณ

    AB_OTA_PARTITIONS += system_dlkm
    

ระบุโมดูลเคอร์เนลที่จะคัดลอกไปยัง system_dlkm

ต้องสร้างโมดูล GKI และ GKI เพื่อให้โหลดโมดูลเสร็จสมบูรณ์ขณะรันไทม์ ดังนั้นคุณต้องระบุโมดูลเคอร์เนลในบิลด์ GKI สำหรับ สถาปัตยกรรมเป้าหมายและระบุเป็นแหล่งที่มาสำหรับพาร์ติชัน system_dlkm ระหว่างการสร้างแพลตฟอร์ม

สำหรับ Android 13

ชี้ BOARD_SYSTEM_DLKM_SRC ไปยังโฟลเดอร์ที่มีโมดูล GKI ที่จำเป็น ไฟล์ออบเจ็กต์เคอร์เนลสำหรับอุปกรณ์เป็นอินพุตไปยังระบบบิลด์เพื่อสร้าง พาร์ติชัน 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 ที่มีทรัพยากร Dependency บนโมดูลใน system_dlkm พาร์ติชันสร้างการอ้างอิงที่ถูกต้องในไฟล์ modules.dep สำหรับ พาร์ติชัน vendor_dlkm เนื่องจากมีการแสดงทรัพยากร Dependency แบบข้ามพาร์ติชัน โดย modules.dep เมื่อ ระบบจะโหลดโมดูลผู้ให้บริการ และโมดูล GKI ใดๆ ที่จำเป็นจะโหลดโดยอัตโนมัติ

เช่น หากต้องการติดตั้งโมดูล GKI ทั้งหมดในพาร์ติชัน system_dlkm สำหรับ GKI arm64 เคอร์เนล 5.15 จากที่สร้างไว้ล่วงหน้า:

 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