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

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

เตรียมโมดูลในแผนผังสำหรับการดึงสัญลักษณ์

ในการเตรียมโมดูล In-Tree สำหรับการดึงข้อมูลสัญลักษณ์ ให้แสดงรายการ Intree ของผู้ให้บริการเฉพาะ ในแอตทริบิวต์ module_outs ของเป้าหมาย kernel_build โปรดดู _VIRT_COMMON_MODULES และ การใช้งาน อย่ารวมโมดูล GKI ในรายการนี้

กำหนดค่าโมดูลเหล่านี้ unsign มิฉะนั้นรายการสัญลักษณ์อาจว่างเปล่า ในการดำเนินการ ให้เพิ่มบรรทัดนี้ลงในเคอร์เนล ส่วนย่อยการกำหนดค่า:

# CONFIG_MODULE_SIG_ALL is not set

โปรดดู common-modules/virtual-device/virtual_device_core.ส่วนย่อย เป็นต้น

เพิ่มรายการสัญลักษณ์ของอุปกรณ์ไปยังบิลด์เคอร์เนลของอุปกรณ์

เพิ่มแอตทริบิวต์ 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

อัปเดตรายการสัญลักษณ์ของอุปกรณ์เพื่อเติมรายการสัญลักษณ์ใหม่และ ส่งไปยังที่เก็บ Kernel ร่วมของ 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 ทั่วไป เคอร์เนล เพื่อให้สัญลักษณ์ใหม่นี้เป็นส่วนหนึ่งของ 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):