เพื่อลดพื้นผิวของสัญลักษณ์และประเภทที่ต้องรักษาให้เสถียร เคอร์เนล 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 ถูก แช่แข็ง
นอกจากนี้ยังมีประโยชน์เมื่อคุณใช้รายการสัญลักษณ์เดียวกันสำหรับอุปกรณ์ที่แตกต่างกันหลายเครื่อง วิธีนี้จะไม่ลบสัญลักษณ์ที่ใช้โดยอุปกรณ์ 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 ในรายการนี้
กำหนดค่าโมดูลเหล่านี้ให้เป็น unsigned มิฉะนั้นรายการสัญลักษณ์อาจว่างเปล่า โดยเพิ่มบรรทัดนี้ลงในส่วนการกำหนดค่าเคอร์เนลของคุณ:
# 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 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.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 build ( 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