กำหนดค่าฟีเจอร์เคอร์เนลเป็นโมดูล 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 ของไฟล์ต่อไปนี้ เพิ่มไฟล์ตามลำดับที่จัดเรียง หากไม่แน่ใจว่าไฟล์ใดบ้างที่สร้างขึ้น บิลด์จะสร้างไฟล์ไม่สำเร็จและแสดงรายการไฟล์ KO ทั้งหมดที่จำเป็นต้องเพิ่มลงในรายการ

    • ใน android17-6.18 ขึ้นไป ให้เพิ่มรายการลงใน common/bazel/modules_private.bzl
    • ใน android16-6.12 ลงไป ให้เพิ่มรายการลงใน common/modules.bzl
  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 ของไฟล์ต่อไปนี้ เพิ่มไฟล์ตามลำดับที่จัดเรียง หากไม่แน่ใจว่าไฟล์ใดบ้างที่สร้างขึ้น บิลด์จะสร้างไฟล์ไม่สำเร็จและแสดงรายการไฟล์ KO ทั้งหมดที่จำเป็นต้องเพิ่มลงในรายการ

    • ใน android17-6.18 ขึ้นไป ให้เพิ่มรายการลงใน common/bazel/modules_private.bzl
    • ใน android16-6.12 ลงไป ให้เพิ่มรายการลงใน `common/modules.bzl`
  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 ในไฟล์ต่อไปนี้

    • ใน android17-6.18 ขึ้นไป ให้เพิ่มรายการลงใน common/bazel/modules_private.bzl
    • ใน android16-6.12 ลงไป ให้เพิ่มรายการลงใน 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 เป็นโมดูลของผู้ให้บริการที่ไม่ได้ลงชื่อและพยายามแก้สัญลักษณ์ some_kernel_function ที่ส่งออกจากโมดูล GKI ระหว่างการโหลด โดยไม่ได้ระบุไว้ในรายการสัญลักษณ์ของผู้ให้บริการ

วิธีแก้ปัญหา:

หาก 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 หากโมดูลที่ไม่ได้ลงชื่อเป็นเวอร์ชันที่กำหนดเอง