เพื่อลดการแสดงสัญลักษณ์และประเภทที่ต้องรักษาให้เสถียร
เคอร์เนล 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
):
คัดลอกรายการสัญลักษณ์ที่อัปเดตแล้วไปยัง
common/android/abi_gki_aarch64_<device>
ตรวจสอบว่า
android/abi_gki_aarch64_<device>
รวมอยู่ในADDITIONAL_KMI_SYMBOL_LISTS
ในcommon/build.config.gki.aarch64