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

  4. ส่งการเปลี่ยนแปลงเข้ารับการตรวจสอบ โมดูล 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 หากโมดูลที่ไม่มีการรับรองเป็นเวอร์ชันที่กำหนดเอง