กำหนดค่าฟีเจอร์เคอร์เนลเป็นโมดูล 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 15 ขึ้นไป ให้ข้ามขั้นตอนนี้

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

  4. อัปเดตรายการการส่งออกให้รวมการส่งออกที่เพิ่มเข้ามาใหม่ใน common/android/abi_gki_protected_exports_ARCHITECTURE เช่น หากต้องการอัปเดตรายการ ให้ใช้ tools/bazel run //common:kernel_aarch64_abi_update_protected_exports กับ aarch64 โมดูลที่ระบุว่าเป็นโมดูล GKI ที่มีการป้องกันยังคงต้องได้รับอนุมัติจาก Google เพื่อใช้เป็นโมดูลที่มีการป้องกันอย่างเป็นทางการ

  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 เท่านั้น จึงไม่จำเป็นต้องส่งแพตช์การแปลงโมดูลไปยัง upstream อย่างไรก็ตาม คุณต้องปฏิบัติตามหลักเกณฑ์อื่นๆ เพื่อส่งแพตช์เคอร์เนลทั่วไปของ Android (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. เพิ่มชุดไฟล์ KO เดียวกันจากขั้นตอนที่ 2 โดยจัดเรียงตามลําดับจากน้อยไปมากสําหรับการค้นหาแบบไบนารีที่รันไทม์ไปยัง common/android/gki_{ARCH}_protected_modules เพื่อกําหนดโมดูลเป็นโมดูล GKI ที่ปกป้อง อัปเดตรายการการส่งออกที่ได้รับความคุ้มครองให้รวมการส่งออกจากข้อบังคับที่เพิ่มใหม่ใน common/android/abi_gki_protected_exports_{ARCH} โดยใช้ tools/bazel run //common:kernel_aarch64_abi_update_protected_exports สำหรับ aarch64 โมดูลที่ระบุว่าเป็นโมดูล GKI ที่มีการป้องกันยังคงต้องได้รับอนุมัติจาก Google เพื่อใช้เป็นโมดูลที่มีการป้องกันอย่างเป็นทางการ

  4. ตรวจสอบว่าได้คัดลอกไฟล์ 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 ในบิลด์แพลตฟอร์ม

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

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

    • สำหรับ Android 14 และเวอร์ชันก่อนหน้า: นำโมดูลที่กำลังเปลี่ยนจาก "มีการป้องกัน" เป็น "ไม่มีการป้องกัน" ออกจากรายการโมดูลที่มีการป้องกันที่ common/android/gki_protected_modules
    • สำหรับ Android 15 ขึ้นไป: เพิ่มโมดูลที่แปลงจาก "มีการป้องกัน" เป็น "ไม่มีการป้องกัน" ลงในรายการ COMMON_UNPROTECTED_MODULES_LIST ในไฟล์ common/modules.bzl
  1. อัปเดตรายการการส่งออกที่ได้รับการปกป้องเพื่อยกเว้นการส่งออกจากข้อบังคับที่แปลงใหม่ซึ่งไม่มีการป้องกันใน common/android/abi_gki_protected_exports_{ARCH} โดยใช้ tools/bazel run //common:kernel_aarch64_abi_update_protected_exports สำหรับ aarch64

  2. ส่งการเปลี่ยนแปลงเข้ารับการตรวจสอบ โมดูล GKI เป็นฟีเจอร์เคอร์เนลสำหรับ Android เท่านั้น จึงไม่จำเป็นต้องส่งแพตช์การแปลงโมดูลไปยัง upstream อย่างไรก็ตาม คุณต้องปฏิบัติตามหลักเกณฑ์อื่นๆ เพื่อส่งแพตช์ 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 หากโมดูลที่ไม่มีการรับรองเป็นเวอร์ชันที่กำหนดเอง