หน้านี้จะอธิบายวิธีกำหนดค่าฟีเจอร์เคอร์เนลใหม่เป็นโมดูล GKI หรือ กำหนดค่าฟีเจอร์เคอร์เนลที่มีอยู่แล้วเป็นโมดูล GKI
กำหนดค่าฟีเจอร์ใหม่เป็นโมดูล GKI
สำหรับฟีเจอร์ใหม่ ให้แก้ไข
gki_defconfig
และตั้งค่ารายการกำหนดค่าของฟีเจอร์เคอร์เนลที่จำเป็นจากn
เป็นm
(=m
) ตั้งค่านี้ทั้งในarch/arm64/configs/gki_defconfig
และarch/x86/configs/gki_defconfig
เพิ่มไฟล์ KO (
.ko
) ที่สร้างขึ้นสำหรับฟีเจอร์นี้ ลงในส่วนCOMMON_GKI_MODULES_LIST
ของcommon/modules.bzl
เพิ่ม ไฟล์ตามลำดับที่จัดเรียง หากคุณไม่แน่ใจเกี่ยวกับไฟล์ทั้งหมดที่สร้างขึ้น การสร้างจะล้มเหลวและแสดงรายการไฟล์ KO ที่จำเป็นทั้งหมดเพื่อเพิ่มลงในรายการสำหรับ Android 14 ให้เพิ่มชุดไฟล์ KO เดียวกันจากขั้นตอนที่ 2 โดยเรียงตามลำดับจากน้อยไปมาก สำหรับการค้นหาแบบไบนารีที่รันไทม์ ไปยัง
common/android/gki_{ARCH}_protected_modules
เพื่อกำหนดให้โมดูลเป็นโมดูล GKI ที่ได้รับการป้องกันสำหรับ Android 14 และ 15 ให้อัปเดตรายการการส่งออกเพื่อให้รวมการส่งออกที่เพิ่มใหม่ใน
common/android/abi_gki_protected_exports_ARCHITECTURE
เช่น หากต้องการอัปเดตรายการ ให้เรียกใช้tools/bazel run //common:kernel_aarch64_abi_update_protected_exports
สำหรับaarch64
ตรวจสอบว่าได้คัดลอกไฟล์ 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
ในการสร้างแพลตฟอร์มได้ส่งการเปลี่ยนแปลงเข้ารับการตรวจสอบ โมดูล GKI เป็นฟีเจอร์เคอร์เนลสำหรับ Android เท่านั้น จึงไม่จำเป็นต้องส่งแพตช์การแปลงโมดูล ไปยังต้นทาง อย่างไรก็ตาม คุณต้องทำตามหลักเกณฑ์อื่นๆ เพื่อส่งแพตช์ Android Common Kernel (ACK)
กำหนดค่าฟีเจอร์ที่บิลด์อินของเคอร์เนลเป็นโมดูล GKI
สำหรับฟีเจอร์เคอร์เนลในตัวที่มีอยู่ ให้แก้ไข
gki_defconfig
และตั้งค่ารายการกำหนดค่าของฟีเจอร์เคอร์เนลที่จำเป็นจากy
เป็นm
(=m
) ตั้งค่านี้ในทั้งarch/arm64/configs/gki_defconfig
และarch/x86/configs/gki_defconfig
เพิ่มไฟล์ KO (
.ko
) ที่สร้างขึ้นสำหรับฟีเจอร์นี้ลงในส่วนCOMMON_GKI_MODULES_LIST
ของcommon/modules.bzl
เพิ่มไฟล์ ตามลำดับที่เรียง หากคุณไม่แน่ใจเกี่ยวกับไฟล์ทั้งหมดที่สร้างขึ้น การสร้างจะล้มเหลวและแสดงรายการไฟล์ KO ที่จำเป็นทั้งหมดเพื่อเพิ่มลงในรายการสำหรับ Android 14 ให้เพิ่มชุดไฟล์ KO เดียวกันจากขั้นตอนที่ 2 โดยเรียงตามลำดับจากน้อยไปมาก สำหรับการค้นหาแบบไบนารีที่รันไทม์ ไปยัง
common/android/gki_{ARCH}_protected_modules
เพื่อกำหนดให้โมดูลเป็นโมดูล GKI ที่ได้รับการป้องกันสำหรับ Android 14 และ 15 ให้อัปเดตรายการการส่งออกที่ได้รับการปกป้องให้ รวมรายการจากโมดูลที่เพิ่มใหม่ใน
common/android/abi_gki_protected_exports_{ARCH}
โดยใช้tools/bazel run //common:kernel_aarch64_abi_update_protected_exports
สำหรับaarch64
ตรวจสอบว่าได้คัดลอกไฟล์ 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
ในการสร้างแพลตฟอร์มได้ส่งการเปลี่ยนแปลงเข้ารับการตรวจสอบ โมดูล GKI เป็นฟีเจอร์เคอร์เนลสำหรับ Android เท่านั้น จึงไม่จำเป็นต้องส่งแพตช์การแปลงโมดูล ไปยังต้นทาง อย่างไรก็ตาม คุณต้องทำตามหลักเกณฑ์อื่นๆ เพื่อส่งแพตช์ Android Common Kernel (ACK)
แปลงโมดูล GKI ที่ได้รับการปกป้องเป็นโมดูลที่ไม่ได้รับการปกป้อง
สำหรับ Android 15 ขึ้นไป ให้เพิ่มโมดูลที่แปลงจากโมดูลที่ได้รับการปกป้องเป็นโมดูลที่ไม่ได้รับการปกป้องลงใน
COMMON_UNPROTECTED_MODULES_LIST
รายการในไฟล์common/modules.bzl
สำหรับ Android 14 ให้นำโมดูลที่แปลงจากโมดูลที่ได้รับการปกป้องเป็นโมดูลที่ไม่ได้ปกป้องออกจากรายการโมดูลที่ได้รับการปกป้องที่
common/android/gki_protected_modules
สำหรับ Android 14 และ 15 ให้อัปเดตรายการการส่งออกที่ได้รับการปกป้องเพื่อ ยกเว้นรายการจากโมดูลที่ไม่มีการป้องกันซึ่งแปลงใหม่ใน
common/android/abi_gki_protected_exports_{ARCH}
โดยใช้tools/bazel run //common:kernel_aarch64_abi_update_protected_exports
สำหรับaarch64
ส่งการเปลี่ยนแปลงเข้ารับการตรวจสอบ โมดูล 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
หากโมดูลที่ไม่ได้ลงนามเป็นเวอร์ชันที่กำหนดเอง