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