เคอร์เนล GKI มีความสามารถในการจำกัดสัญลักษณ์ที่ส่งออกให้มีเฉพาะสัญลักษณ์ที่โมดูลต้องการเท่านั้น เพื่อลดพื้นผิวของสัญลักษณ์และประเภทที่ต้องคงไว้ให้เสถียร
สำหรับโมดูลที่คอมไพล์ภายนอก คุณต้องมีรายการ
ของสัญลักษณ์ที่ใช้เพื่ออนุญาตให้เคอร์เนล GKI ส่งออกได้ เช่น ระบบจะจัดเก็บสัญลักษณ์ที่โมดูลใช้สำหรับ Cuttlefish ไว้ใน gki/aarch64/symbols/virtual_device
เพิ่มเป้าหมายสำหรับการสร้างรายการสัญลักษณ์
kernel_abi
เป้าหมายจะสร้างรายการสัญลักษณ์ เพิ่มเป้าหมายนี้ลงใน
อุปกรณ์ BUILD.bazel
โดยใช้ตัวเลือกต่อไปนี้
name
ควรอยู่ในรูปแบบ
<kernel_build>_abi
kernel_build
ควรมีชื่อของเป้าหมายอุปกรณ์
kernel_build
นอกจากนี้ คุณยังใช้ตัวเลือกต่อไปนี้ได้ด้วย
kernel_modules
รายการเป้าหมายสำหรับโมดูลนอกทรี ไม่ควรระบุโมดูล 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 ด้วย
เตรียมโมดูลในทรีสำหรับการแยกสัญลักษณ์
หากต้องการเตรียมโมดูลในทรีสำหรับการแยกสัญลักษณ์ ให้แสดงรายการโมดูลในทรีที่เฉพาะเจาะจงของผู้ให้บริการ
ในแอตทริบิวต์ 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
filegroup ซึ่งประกาศไว้ใน
common/BUILD.bazel
อัปเดตรายการสัญลักษณ์ของอุปกรณ์เพื่อเติมรายการสัญลักษณ์ใหม่และ ส่งไปยังที่เก็บเคอร์เนลทั่วไปของ Android
อัปเดตรายการสัญลักษณ์อุปกรณ์
สัญลักษณ์เคอร์เนลหลักทั้งหมดที่ใช้โดยโมดูลใน 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
ส่งแพตช์ที่มีการเปลี่ยนแปลงรายการสัญลักษณ์ไปยัง Gerrit ของAndroid Common Kernel เพื่อให้สัญลักษณ์ใหม่เป็นส่วนหนึ่งของ 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.aarch64
KMI_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