ใช้งานรายการสัญลักษณ์

เคอร์เนล 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_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) ด้วย