Để giảm số lượng ký hiệu và loại cần duy trì ở trạng thái ổn định, kernel GKI có các tính năng để giới hạn các ký hiệu được xuất thành chỉ những ký hiệu mà mô-đun cần. Đối với các mô-đun được biên dịch bên ngoài, bạn cần có danh sách các ký hiệu đã dùng để cho phép kernel GKI xuất các ký hiệu đó. Ví dụ:
các ký hiệu mà mô-đun dùng cho
Cuttlefish được lưu trữ
trong
gki/aarch64/symbols/virtual_device.
Thêm mục tiêu để tạo danh sách ký hiệu
Danh sách ký hiệu được tạo bởi mục tiêu kernel_abi. Thêm mục tiêu này vào BUILD.bazel của thiết bị bằng các tuỳ chọn sau:
namePhải ở định dạng
<kernel_build>_abi.kernel_buildPhải chứa tên của mục tiêu
kernel_buildcủa thiết bị.
Bạn cũng có thể dùng các tuỳ chọn sau:
kernel_modulesDanh sách các mục tiêu cho mô-đun ngoài cây. Không nên đưa các mô-đun trong cây vào đây. Tham khảo bài viết Chuẩn bị mô-đun trong cây để trích xuất ký hiệu.
kmi_symbol_list_add_onlyTuỳ chọn này ngăn việc xoá các ký hiệu không dùng. Bạn chỉ được phép xoá ký hiệu vào những thời điểm cụ thể trong quá trình ổn định KMI và không được phép xoá sau khi KMI bị đóng băng.
Tuỳ chọn này cũng hữu ích khi bạn dùng cùng một danh sách ký hiệu cho nhiều thiết bị khác nhau. Bằng cách này, danh sách sẽ không xoá các ký hiệu mà thiết bị A dùng nhưng thiết bị B không dùng.
module_groupingNếu
Truehoặc không được chỉ định, thì danh sách ký hiệu sẽ nhóm các ký hiệu dựa trên các mô-đun kernel tham chiếu đến ký hiệu đó. Nếu không, danh sách ký hiệu sẽ là danh sách các ký hiệu được sắp xếp mà tất cả các mô-đun kernel dùng.
Xem
common-modules/virtual-device/BUILD.bazel
để biết ví dụ:
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,
)
Ngoài ra, hãy xem
tài liệu tham khảo
về kernel_abi mục tiêu trong Kleaf.
Chuẩn bị mô-đun trong cây để trích xuất ký hiệu
Để chuẩn bị mô-đun trong cây để trích xuất ký hiệu, hãy liệt kê các mô-đun trong cây dành riêng cho nhà cung cấp trong thuộc tính module_outs của mục tiêu kernel_build. Xem
_VIRT_COMMON_MODULES
và
cách sử dụng thuộc tính này
để biết ví dụ. Đừng đưa các mô-đun GKI vào danh sách này.
Định cấu hình các mô-đun này để không được ký, nếu không danh sách ký hiệu có thể trống. Để làm vậy, hãy thêm dòng này vào các đoạn cấu hình kernel:
# CONFIG_MODULE_SIG_ALL is not set
Xem
common-modules/virtual-device/virtual_device_core.fragment
để biết ví dụ.
Thêm danh sách ký hiệu thiết bị vào bản dựng kernel thiết bị
Thêm thuộc tính kmi_symbol_list vào mục tiêu kernel_build được xác định trong BUILD.bazel của thiết bị. Tên của danh sách ký hiệu phải ở định dạng của
//common:gki/<arch>/symbols/<device>.
Ví dụ: xem
common-modules/virtual-device/BUILD.bazel,
kernel_build(
name = "virtual_device_aarch64",
base_kernel = "//common:kernel_aarch64",
kmi_symbol_list = "//common:gki/aarch64/symbols/virtual_device",
...
module_outs = _VIRT_COMMON_MODULES + _VIRT_AARCH64_MODULES,
)
Tạo và gửi danh sách ký hiệu ban đầu
Tạo danh sách ký hiệu trống tại common/gki/<arch>/symbols/<device>. Đối với ví dụ ở trên, lệnh sẽ là:
touch common/gki/aarch64/symbols/virtual_deviceThêm tệp này vào additional_kmi_symbol_lists của bản dựng kernel GKI cơ sở. Ví dụ:
//common:gki/aarch64/symbols/virtual_device được thêm vào nhóm tệp
aarch64_additional_kmi_symbol_lists được khai báo trong
common/BUILD.bazel.
Cập nhật danh sách ký hiệu thiết bị để điền danh sách ký hiệu mới và gửi danh sách đó đến kho lưu trữ Android Common Kernel.
Cập nhật danh sách ký hiệu thiết bị
Tất cả các ký hiệu kernel cốt lõi mà mô-đun dùng trong module_outs của kernel_build và kernel_modules của kernel_abi phải có trong danh sách ký hiệu. Bạn có thể thực hiện việc này bằng cách chạy mục tiêu kernel_abi với hậu tố _update_symbol_list. Ví dụ: lệnh sau đây sẽ cập nhật danh sách ký hiệu cho //common-modules/virtual-device:virtual_device_aarch64:
tools/bazel run //common-modules/virtual-device:virtual_device_aarch64_abi_update_symbol_listGửi thông tin cập nhật danh sách ký hiệu đến ACK
Gửi bản vá có thay đổi về danh sách ký hiệu đến Android Common Kernel gerrit để các ký hiệu mới trở thành một phần của KMI.
Thông báo cam kết phải bao gồm danh sách các ký hiệu đã thêm hoặc xoá. Bạn có thể
tự viết danh sách này để cập nhật danh sách ký hiệu nhỏ hoặc dùng
$DIST_DIR/abi_stgdiff/abi.report.short báo cáo sau khi
cập nhật bản trình bày ABI
tham chiếu.
Mặc dù bạn không bắt buộc phải cập nhật bản trình bày ABI tham chiếu trước khi gửi thông tin cập nhật danh sách ký hiệu, nhưng việc này có thể giúp bạn loại bỏ các bước kiểm tra trước khi gửi bổ sung và giúp bạn gửi thay đổi nhanh hơn. Trong mọi trường hợp, hệ thống sẽ kiểm tra và cập nhật nếu cần trong quá trình kiểm tra trước khi gửi.
Xử lý danh sách ký hiệu (Android 13)
Android 13 hỗ trợ cả Kleaf và tập lệnh bản dựng cũ, vì vậy, bạn có thể quản lý danh sách ký hiệu như mô tả trong các phần trước hoặc như mô tả trong phần sau.
Xử lý danh sách ký hiệu (Android 12 trở xuống)
Dùng công cụ build_abi.sh như sau:
BUILD_CONFIG=path/to/build.config.device build/build_abi.sh --update-symbol-listTrong ví dụ này, build.config.device phải bao gồm các tuỳ chọn cấu hình sau:
vmlinuxPhải nằm trong danh sách
FILES. Bạn có thể thực hiện việc này bằng cách thêmbuild.config.aarch64.KMI_SYMBOL_LISTPhải được đặt và trỏ đến danh sách ký hiệu KMI cần cập nhật.
Sau khi cập nhật danh sách ký hiệu thiết bị, bạn cũng cần phản ánh những thay đổi này trong bản dựng GKI (common/build.config.gki.aarch64):
Sao chép danh sách ký hiệu đã cập nhật vào
common/android/abi_gki_aarch64_<device>.Kiểm tra để đảm bảo rằng
android/abi_gki_aarch64_<device>có trongADDITIONAL_KMI_SYMBOL_LISTStrongcommon/build.config.gki.aarch64.