หน้านี้จะอธิบายวิธีกำหนดค่าฟีเจอร์เคอร์เนลใหม่เป็นโมดูล 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 ที่จำเป็นทั้งหมดที่จะเพิ่มลงในรายการเพิ่มไฟล์ 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 (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 ที่มีการป้องกันเป็นโมดูลที่ไม่มีการป้องกัน
นำโมดูลที่แปลงจาก "มีการป้องกัน" เป็น "ไม่มีการป้องกัน" ออกจากรายการโมดูลที่มีการป้องกันที่
common/android/gki_protected_modules
อัปเดตรายการการส่งออกที่มีการป้องกันเพื่อยกเว้นการส่งออกจากโมดูลที่ไม่มีการป้องกันที่แปลงใหม่ใน
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
หากโมดูลที่ไม่ได้ลงชื่อเป็นเวอร์ชันที่กำหนดเอง