เพื่อลดจำนวนสัญลักษณ์และประเภทที่ต้องคงไว้ให้เสถียร เคอร์เนล GKI จึงมีความสามารถในการจำกัดสัญลักษณ์ที่ส่งออกให้มีเฉพาะสัญลักษณ์ที่โมดูลต้องการเท่านั้น สําหรับโมดูลที่คอมไพล์จากภายนอก คุณต้องมีรายการสัญลักษณ์ที่ใช้เพื่อให้เคอร์เนล GKI ส่งออกได้ ตัวอย่างเช่น ระบบจะจัดเก็บสัญลักษณ์ที่ใช้โดยโมดูลสำหรับ Cuttlefish ใน android/abi_gki_aarch64_virtual_device
เพิ่มเป้าหมายสําหรับการสร้างรายการสัญลักษณ์
รายการสัญลักษณ์จะสร้างขึ้นโดยเป้าหมาย kernel_abi
เพิ่มเป้าหมายนี้ลงในอุปกรณ์ BUILD.bazel
ด้วยตัวเลือกต่อไปนี้
name
ควรอยู่ในรูปแบบ
<kernel_build>_abi
kernel_build
ควรมีชื่อเป้าหมาย
kernel_build
ของอุปกรณ์
คุณยังใช้ตัวเลือกต่อไปนี้ได้ด้วย
kernel_modules
รายการเป้าหมายสําหรับโมดูลนอกต้นไม้ ไม่ควรรวมโมดูลในต้นไม้ไว้ที่นี่ โปรดดูหัวข้อเตรียมโมดูลในต้นไม้สำหรับการดึงข้อมูลสัญลักษณ์
kmi_symbol_list_add_only
ตัวเลือกนี้จะป้องกันไม่ให้นำสัญลักษณ์ที่ไม่ได้ใช้ออก การนำสัญลักษณ์ออกจะอนุญาตเฉพาะในช่วงเวลาที่เจาะจงระหว่างการทำให้เสถียรของ KMI เท่านั้น และไม่อนุญาตเมื่อ KMI หยุดทำงาน
ซึ่งจะมีประโยชน์เมื่อคุณใช้รายการสัญลักษณ์เดียวกันกับอุปกรณ์หลายเครื่อง วิธีนี้จะไม่นำสัญลักษณ์ที่อุปกรณ์ ก. ใช้แต่อุปกรณ์ ข. ไม่ได้ใช้ออก
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 ของเคอร์เนล
# CONFIG_MODULE_SIG_ALL is not set
โปรดดูตัวอย่างที่ common-modules/virtual-device/virtual_device_core.fragment
เพิ่มรายการสัญลักษณ์ของอุปกรณ์ลงในบิลด์เคอร์เนลของอุปกรณ์
เพิ่มแอตทริบิวต์ kmi_symbol_list
ลงในเป้าหมาย kernel_build
ที่กําหนดไว้ในอุปกรณ์ BUILD.bazel
ชื่อของรายการสัญลักษณ์ควรอยู่ในรูปแบบของ
//common:android/abi_gki_<arch>_<device>
ดูตัวอย่างได้ที่ common-modules/virtual-device/BUILD.bazel ดังนี้
kernel_build(
name = "virtual_device_aarch64",
base_kernel = "//common:kernel_aarch64",
kmi_symbol_list = "//common:android/abi_gki_aarch64_virtual_device",
...
module_outs = _VIRT_COMMON_MODULES + _VIRT_AARCH64_MODULES,
)
สร้างและส่งรายการสัญลักษณ์เริ่มต้น
สร้างรายการสัญลักษณ์ว่างที่ common/android/abi_gki_<arch>_<device>
สําหรับตัวอย่างข้างต้น คําสั่งจะเป็นดังนี้
touch common/android/abi_gki_aarch64_virtual_device
เพิ่มไฟล์นี้ลงใน additional_kmi_symbol_lists
ของบิลด์เคอร์เนล GKI พื้นฐาน ตัวอย่างเช่น ระบบจะเพิ่ม //common:android/abi_gki_aarch64_virtual_device
ลงในไฟล์กลุ่ม aarch64_additional_kmi_symbol_lists
ที่ประกาศไว้ใน 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
ส่งแพตช์ที่มีการเปลี่ยนแปลงรายการสัญลักษณ์ไปยัง Android Common ของ Gerrit เพื่อให้สัญลักษณ์ใหม่เป็นส่วนหนึ่งของ KMI
ข้อความคอมมิตควรมีรายการสัญลักษณ์ที่เพิ่มหรือนําออก คุณสามารถเขียนรายการนี้ด้วยตนเองเพื่ออัปเดตรายการสัญลักษณ์ขนาดเล็ก หรือจะใช้$DIST_DIR/abi.report.short
รายงานหลังจากอัปเดตการนําเสนอ ABI อ้างอิงก็ได้
แม้ว่าจะไม่จำเป็นต้องอัปเดตการนําเสนอ ABI อ้างอิงก่อนส่งการอัปเดตรายการสัญลักษณ์ แต่การอัปเดตอาจช่วยตัดขั้นตอนเพิ่มเติมก่อนส่งและทําให้การเปลี่ยนแปลงพร้อมส่งได้เร็วขึ้น ไม่ว่าในกรณีใด ระบบจะตรวจสอบและอัปเดตข้อมูลหากจำเป็นในระหว่างการส่งข้อมูลก่อน
เวอร์ชันเก่า (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