กำหนดค่าฟีเจอร์เคอร์เนลเป็นโมดูล GKI

หน้านี้จะอธิบายวิธีกำหนดค่าฟีเจอร์เคอร์เนลใหม่เป็นโมดูล GKI หรือ กำหนดค่าฟีเจอร์เคอร์เนลที่มีอยู่แล้วเป็นโมดูล GKI

กำหนดค่าฟีเจอร์ใหม่เป็นโมดูล GKI

  1. สำหรับฟีเจอร์ใหม่ ให้แก้ไข gki_defconfig และตั้งค่ารายการกำหนดค่าของฟีเจอร์เคอร์เนลที่จำเป็นจาก n เป็น m (=m) ตั้งค่านี้ทั้งใน arch/arm64/configs/gki_defconfig และ arch/x86/configs/gki_defconfig

  2. เพิ่มไฟล์ KO (.ko) ที่สร้างขึ้นสำหรับฟีเจอร์นี้ ลงในส่วน COMMON_GKI_MODULES_LIST ของ common/modules.bzl เพิ่ม ไฟล์ตามลำดับที่จัดเรียง หากคุณไม่แน่ใจเกี่ยวกับไฟล์ทั้งหมดที่สร้างขึ้น การสร้างจะล้มเหลวและแสดงรายการไฟล์ KO ที่จำเป็นทั้งหมดเพื่อเพิ่มลงในรายการ

  3. สำหรับ Android 14 ให้เพิ่มชุดไฟล์ KO เดียวกันจากขั้นตอนที่ 2 โดยเรียงตามลำดับจากน้อยไปมาก สำหรับการค้นหาแบบไบนารีที่รันไทม์ ไปยัง common/android/gki_{ARCH}_protected_modules เพื่อกำหนดให้โมดูลเป็นโมดูล GKI ที่ได้รับการป้องกัน

  4. สำหรับ Android 14 และ 15 ให้อัปเดตรายการการส่งออกเพื่อให้รวมการส่งออกที่เพิ่มใหม่ใน common/android/abi_gki_protected_exports_ARCHITECTURE เช่น หากต้องการอัปเดตรายการ ให้เรียกใช้ tools/bazel run //common:kernel_aarch64_abi_update_protected_exports สำหรับ aarch64

  5. ตรวจสอบว่าได้คัดลอกไฟล์ KO ที่เพิ่มใหม่จากขั้นตอนที่ 2 ไปยัง out/<androidX-Y.Z>/dist/system_dlkm.img และ out/androidX-Y.Z/dist/system_dlkm_staging_archive.tar.gz ของเคอร์เนลแล้ว โมดูลในsystem_dlkm_staging_archive.tar.gzที่เก็บถาวรสามารถใช้เป็น อินพุตเพื่อสร้าง system_dlkm.img ในการสร้างแพลตฟอร์มได้

  6. ส่งการเปลี่ยนแปลงเข้ารับการตรวจสอบ โมดูล GKI เป็นฟีเจอร์เคอร์เนลสำหรับ Android เท่านั้น จึงไม่จำเป็นต้องส่งแพตช์การแปลงโมดูล ไปยังต้นทาง อย่างไรก็ตาม คุณต้องทำตามหลักเกณฑ์อื่นๆ เพื่อส่งแพตช์ Android Common Kernel (ACK)

กำหนดค่าฟีเจอร์ที่บิลด์อินของเคอร์เนลเป็นโมดูล GKI

  1. สำหรับฟีเจอร์เคอร์เนลในตัวที่มีอยู่ ให้แก้ไข gki_defconfig และตั้งค่ารายการกำหนดค่าของฟีเจอร์เคอร์เนลที่จำเป็นจาก y เป็น m (=m) ตั้งค่านี้ในทั้ง arch/arm64/configs/gki_defconfig และ arch/x86/configs/gki_defconfig

  2. เพิ่มไฟล์ KO (.ko) ที่สร้างขึ้นสำหรับฟีเจอร์นี้ลงในส่วน COMMON_GKI_MODULES_LISTของ common/modules.bzl เพิ่มไฟล์ ตามลำดับที่เรียง หากคุณไม่แน่ใจเกี่ยวกับไฟล์ทั้งหมดที่สร้างขึ้น การสร้างจะล้มเหลวและแสดงรายการไฟล์ KO ที่จำเป็นทั้งหมดเพื่อเพิ่มลงในรายการ

  3. สำหรับ Android 14 ให้เพิ่มชุดไฟล์ KO เดียวกันจากขั้นตอนที่ 2 โดยเรียงตามลำดับจากน้อยไปมาก สำหรับการค้นหาแบบไบนารีที่รันไทม์ ไปยัง common/android/gki_{ARCH}_protected_modules เพื่อกำหนดให้โมดูลเป็นโมดูล GKI ที่ได้รับการป้องกัน

  4. สำหรับ Android 14 และ 15 ให้อัปเดตรายการการส่งออกที่ได้รับการปกป้องให้ รวมรายการจากโมดูลที่เพิ่มใหม่ใน common/android/abi_gki_protected_exports_{ARCH} โดยใช้ tools/bazel run //common:kernel_aarch64_abi_update_protected_exports สำหรับ aarch64

  5. ตรวจสอบว่าได้คัดลอกไฟล์ KO ของโมดูลที่แปลงใหม่จากขั้นตอนที่ 2 ไปยัง out/<androidX-Y.Z>/dist/system_dlkm.img และ out/androidX-Y.Z/dist/system_dlkm_staging_archive.tar.gz ของเคอร์เนลแล้ว โมดูลในsystem_dlkm_staging_archive.tar.gzที่เก็บถาวรสามารถใช้เป็น อินพุตเพื่อสร้าง system_dlkm.img ในการสร้างแพลตฟอร์มได้

  6. ส่งการเปลี่ยนแปลงเข้ารับการตรวจสอบ โมดูล GKI เป็นฟีเจอร์เคอร์เนลสำหรับ Android เท่านั้น จึงไม่จำเป็นต้องส่งแพตช์การแปลงโมดูล ไปยังต้นทาง อย่างไรก็ตาม คุณต้องทำตามหลักเกณฑ์อื่นๆ เพื่อส่งแพตช์ Android Common Kernel (ACK)

แปลงโมดูล GKI ที่ได้รับการปกป้องเป็นโมดูลที่ไม่ได้รับการปกป้อง

  1. สำหรับ Android 15 ขึ้นไป ให้เพิ่มโมดูลที่แปลงจากโมดูลที่ได้รับการปกป้องเป็นโมดูลที่ไม่ได้รับการปกป้องลงในCOMMON_UNPROTECTED_MODULES_LIST รายการในไฟล์common/modules.bzl

  2. สำหรับ Android 14 ให้นำโมดูลที่แปลงจากโมดูลที่ได้รับการปกป้องเป็นโมดูลที่ไม่ได้ปกป้องออกจากรายการโมดูลที่ได้รับการปกป้องที่ common/android/gki_protected_modules

  3. สำหรับ Android 14 และ 15 ให้อัปเดตรายการการส่งออกที่ได้รับการปกป้องเพื่อ ยกเว้นรายการจากโมดูลที่ไม่มีการป้องกันซึ่งแปลงใหม่ใน common/android/abi_gki_protected_exports_{ARCH} โดยใช้ tools/bazel run //common:kernel_aarch64_abi_update_protected_exports สำหรับ aarch64

  4. ส่งการเปลี่ยนแปลงเข้ารับการตรวจสอบ โมดูล GKI เป็นฟีเจอร์เคอร์เนลสำหรับ Android เท่านั้น จึงไม่จำเป็นต้องส่งแพตช์การแปลงโมดูล ไปยังต้นทาง อย่างไรก็ตาม คุณต้องทำตามหลักเกณฑ์อื่นๆ เพื่อส่งแพตช์ Android Common Kernel (ACK)

คู่มือฉบับย่อในการแก้ไขการละเมิดสัญลักษณ์ของโมดูล GKI

เมื่อโมดูลที่ไม่ได้ลงนามละเมิดการป้องกันสัญลักษณ์ที่ใช้กับโมดูล GKI คุณอาจพบข้อผิดพลาด 2 ประเภทในระหว่างการโหลดโมดูล ซึ่งจะส่งผลให้ การดำเนินการล้มเหลว

1. โมดูลที่ไม่ได้ลงนามโดยใช้สัญลักษณ์ที่ได้รับการปกป้อง

ข้อผิดพลาด:

module: Protected symbol: some_kernel_function (err -13)

สาเหตุ:

module.ko เป็นโมดูลของผู้ให้บริการที่ไม่ได้ลงนามและพยายามแก้ไขสัญลักษณ์ที่ส่งออกของโมดูล GKI some_kernel_function ระหว่างการโหลดโดยไม่ต้องแสดงในรายการสัญลักษณ์ของผู้ให้บริการ

วิธีแก้ไข:

หาก module.ko ไม่ใช่โมดูล GKI ที่ได้รับการปกป้อง การอัปเดตรายการสัญลักษณ์จะช่วย แก้ไขข้อผิดพลาดได้โดยการรวม some_kernel_function ไว้ในรายการสัญลักษณ์ของผู้ให้บริการ หรือจะใช้ module.ko เวอร์ชัน GKI ก็ได้

2. โมดูลที่ไม่ได้ลงนามซึ่งส่งออกสัญลักษณ์ที่ได้รับการป้องกัน

ข้อผิดพลาด:

module: exports protected symbol some_kernel_function

สาเหตุ:

โมดูลที่ส่งออก some_kernel_function เป็นโมดูล GKI ที่ได้รับการปกป้อง และmodule.ko น่าจะเป็นโมดูลเวอร์ชันที่กำหนดเองที่ไม่ได้ลงนาม เมื่อ module.ko พยายามส่งออก some_kernel_function ซึ่งส่งออกได้โดยโมดูล GKI ที่ลงนามแล้วเท่านั้น การโหลดจะล้มเหลวพร้อมข้อความนี้

วิธีแก้ไข:

ปัญหานี้แก้ไขได้โดยใช้โมดูลเวอร์ชัน GKI ที่ส่งออก some_kernel_function หากโมดูลที่ไม่ได้ลงนามเป็นเวอร์ชันที่กำหนดเอง