กำหนดค่าฟีเจอร์เคอร์เนลเป็นโมดูล 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. เพิ่มไฟล์ 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 (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 ที่มีการป้องกันเป็นโมดูลที่ไม่มีการป้องกัน

  1. นำโมดูลที่แปลงจาก "มีการป้องกัน" เป็น "ไม่มีการป้องกัน" ออกจากรายการโมดูลที่มีการป้องกันที่ common/android/gki_protected_modules

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

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