เคอร์เนล GKI มีความสามารถในการจำกัดสัญลักษณ์ที่ส่งออกให้มีเฉพาะสัญลักษณ์ที่โมดูลต้องการเท่านั้น เพื่อลดพื้นผิวของสัญลักษณ์และประเภทที่ต้องดูแลให้มีเสถียรภาพ สำหรับโมดูลที่คอมไพล์ภายนอก คุณต้องมีรายการสัญลักษณ์ที่ใช้เพื่อให้เคอร์เนล GKI ส่งออกสัญลักษณ์เหล่านั้นได้ ตัวอย่างเช่น
ระบบจะจัดเก็บสัญลักษณ์ที่โมดูลใช้สำหรับ
Cuttlefish ไว้
ใน
gki/aarch64/symbols/virtual_device
เพิ่มเป้าหมายสำหรับการสร้างรายการสัญลักษณ์
ระบบจะสร้างรายการสัญลักษณ์โดยเป้าหมาย kernel_abi เพิ่มเป้าหมายนี้ลงใน BUILD.bazel ของอุปกรณ์โดยใช้ตัวเลือกต่อไปนี้
nameควรอยู่ในรูปแบบ
<kernel_build>_abikernel_buildควรมีชื่อเป้าหมาย
kernel_buildของอุปกรณ์
นอกจากนี้ คุณยังใช้ตัวเลือกต่อไปนี้ได้ด้วย
kernel_modulesรายการเป้าหมายสำหรับโมดูล out-of-tree ไม่ควรใส่โมดูล in-tree ไว้ที่นี่ โปรดดูหัวข้อ เตรียมโมดูล in-tree สำหรับการแยกสัญลักษณ์
kmi_symbol_list_add_onlyตัวเลือกนี้จะป้องกันไม่ให้ระบบนำสัญลักษณ์ที่ไม่ได้ใช้ออก ระบบจะอนุญาตให้นำสัญลักษณ์ออกได้เฉพาะ บางช่วงเวลาในระหว่างการทำให้ KMI มีเสถียรภาพ เท่านั้น และจะไม่อนุญาตเมื่อ KMI หยุดการเปลี่ยนแปลง แล้ว
ตัวเลือกนี้ยังมีประโยชน์เมื่อคุณใช้รายการสัญลักษณ์เดียวกันสำหรับอุปกรณ์ต่างๆ หลายเครื่อง วิธีนี้จะป้องกันไม่ให้ระบบนำสัญลักษณ์ที่อุปกรณ์ A ใช้แต่ไม่ได้ใช้ในอุปกรณ์ B ออก
module_groupingหากเป็น
Trueหรือไม่ได้ระบุ ระบบจะจัดกลุ่มสัญลักษณ์ตามโมดูลเคอร์เนลที่อ้างอิงสัญลักษณ์ ไม่เช่นนั้น รายการสัญลักษณ์จะเป็นรายการสัญลักษณ์ที่จัดเรียงแล้วซึ่งโมดูลเคอร์เนลทั้งหมดใช้
ดูตัวอย่างได้ที่
common-modules/virtual-device/BUILD.bazel
kernel_abi(
name = "virtual_device_aarch64_abi",
kernel_build = ":virtual_device_aarch64",
kernel_modules = [":virtual_device_aarch64_external_modules"],
kmi_symbol_list_add_only = True,
)
ดูเอกสารอ้างอิงเกี่ยวกับเป้าหมาย kernel_abi ใน Kleaf ด้วย
เตรียมโมดูล in-tree สำหรับการแยกสัญลักษณ์
หากต้องการเตรียมโมดูล in-tree สำหรับการแยกสัญลักษณ์ ให้แสดงรายการโมดูล in-tree ที่เฉพาะเจาะจงของผู้ให้บริการในแอตทริบิวต์ module_outs ของเป้าหมาย kernel_build ดูตัวอย่างได้ที่
_VIRT_COMMON_MODULES
และ
การใช้งาน
อย่าใส่โมดูล GKI ในรายการนี้
กำหนดค่าโมดูลเหล่านี้ให้ไม่มีการลงนาม ไม่เช่นนั้น รายการสัญลักษณ์อาจว่างเปล่า หากต้องการทำเช่นนั้น ให้เพิ่มบรรทัดนี้ลงในส่วนย่อยการกำหนดค่าเคอร์เนล
# CONFIG_MODULE_SIG_ALL is not set
ดูตัวอย่างได้ที่
common-modules/virtual-device/virtual_device_core.fragment
เพิ่มรายการสัญลักษณ์ของอุปกรณ์ลงในการสร้างเคอร์เนลของอุปกรณ์
เพิ่มแอตทริบิวต์ kmi_symbol_list ลงในเป้าหมาย kernel_build ที่กำหนดไว้ใน BUILD.bazel ของอุปกรณ์ ชื่อรายการสัญลักษณ์ควรอยู่ในรูปแบบ
//common:gki/<arch>/symbols/<device>
ดูตัวอย่างได้ที่
common-modules/virtual-device/BUILD.bazel,
kernel_build(
name = "virtual_device_aarch64",
base_kernel = "//common:kernel_aarch64",
kmi_symbol_list = "//common:gki/aarch64/symbols/virtual_device",
...
module_outs = _VIRT_COMMON_MODULES + _VIRT_AARCH64_MODULES,
)
สร้างและส่งรายการสัญลักษณ์เริ่มต้น
สร้างรายการสัญลักษณ์ที่ว่างเปล่าที่ common/gki/<arch>/symbols/<device> สำหรับตัวอย่างด้านบน คำสั่งจะเป็นดังนี้
touch common/gki/aarch64/symbols/virtual_deviceเพิ่มไฟล์นี้ลงใน additional_kmi_symbol_lists ของการสร้างเคอร์เนล GKI พื้นฐาน ตัวอย่างเช่น ระบบจะเพิ่ม
//common:gki/aarch64/symbols/virtual_device ลงใน
aarch64_additional_kmi_symbol_lists ไฟล์กลุ่ม ที่ประกาศไว้ใน
common/BUILD.bazel
อัปเดตรายการสัญลักษณ์ของอุปกรณ์เพื่อเติมรายการสัญลักษณ์ใหม่และ ส่งไปยังที่เก็บ Android Common Kernel
อัปเดตรายการสัญลักษณ์ของอุปกรณ์
สัญลักษณ์เคอร์เนลหลักทั้งหมดที่โมดูลใช้ใน module_outs ของ kernel_build และ kernel_modules ของ kernel_abi ควรอยู่ในรายการสัญลักษณ์ คุณทำได้โดยเรียกใช้เป้าหมาย kernel_abi โดยมีคำต่อท้าย _update_symbol_list ตัวอย่างเช่น คำสั่งต่อไปนี้จะอัปเดตรายการสัญลักษณ์สำหรับ //common-modules/virtual-device:virtual_device_aarch64
tools/bazel run //common-modules/virtual-device:virtual_device_aarch64_abi_update_symbol_listส่งการอัปเดตรายการสัญลักษณ์ไปยัง ACK
ส่งแพตช์ที่มีการเปลี่ยนแปลงรายการสัญลักษณ์ไปยัง Android Common Kernel Gerrit เพื่อให้สัญลักษณ์ใหม่เป็นส่วนหนึ่งของ KMI
ข้อความคอมมิตควรมีรายการสัญลักษณ์ที่เพิ่มหรือนำออก คุณสามารถ
เขียนรายการนี้ด้วยตนเองสำหรับการอัปเดตรายการสัญลักษณ์ขนาดเล็ก หรือใช้
$DIST_DIR/abi_stgdiff/abi.report.short รายงานหลังจาก
อัปเดตการแสดง ABI อ้างอิง
แม้ว่าการอัปเดตการแสดง ABI อ้างอิงก่อนส่งการอัปเดตรายการสัญลักษณ์จะไม่บังคับ แต่ก็อาจช่วยลดขั้นตอนการตรวจสอบก่อนส่งและทำให้การเปลี่ยนแปลงพร้อมส่งได้เร็วขึ้น อย่างไรก็ตาม ระบบจะตรวจสอบและอัปเดตหากจำเป็นในระหว่างการตรวจสอบก่อนส่ง
การใช้รายการสัญลักษณ์ (Android 13)
Android 13 รองรับทั้ง Kleaf และสคริปต์บิลด์เดิม คุณจึงจัดการรายการสัญลักษณ์ได้ตามที่อธิบายไว้ในส่วนก่อนหน้าหรือตามที่อธิบายไว้ในส่วนต่อไปนี้
การใช้รายการสัญลักษณ์ (Android 12 และต่ำกว่า)
ใช้เครื่องมือ build_abi.sh ดังนี้
BUILD_CONFIG=path/to/build.config.device build/build_abi.sh --update-symbol-listในตัวอย่างนี้ build.config.device ต้องมีตัวเลือกการกำหนดค่าต่อไปนี้
vmlinuxต้องเป็นส่วนหนึ่งของรายการ
FILESคุณทำได้โดยใส่build.config.aarch64KMI_SYMBOL_LISTต้องตั้งค่าและชี้ไปยังรายการสัญลักษณ์ KMI ที่จะอัปเดต
หลังจากอัปเดตรายการสัญลักษณ์ของอุปกรณ์แล้ว คุณต้องแสดงการเปลี่ยนแปลงเหล่านี้ในการสร้าง GKI (common/build.config.gki.aarch64) ด้วย โดยทำดังนี้
คัดลอกรายการสัญลักษณ์ที่อัปเดตแล้วไปยัง
common/android/abi_gki_aarch64_<device>ตรวจสอบว่า
android/abi_gki_aarch64_<device>รวมอยู่ในADDITIONAL_KMI_SYMBOL_LISTSในcommon/build.config.gki.aarch64