Cách làm việc với danh sách ký hiệu

Để giảm bớt bề mặt của các ký hiệu và loại cần được duy trì ở mức ổn định, nhân GKI có chức năng giới hạn các ký hiệu được xuất 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 được sử dụng để cho phép nhân GKI xuất chúng. Ví dụ: các ký hiệu được mô-đun sử dụng cho Mực nang được lưu trữ trong android/abi_gki_aarch64_virtual_device .

Thêm mục tiêu cho việc tạo danh sách ký hiệu

Danh sách biểu tượng được tạo bởi mục tiêu kernel_abi . Thêm mục tiêu này vào thiết bị BUILD.bazel với các tùy chọn sau:

  • name

    Phải ở định dạng <kernel_build>_abi .

  • kernel_build

    Nên chứa tên của mục tiêu kernel_build của thiết bị.

Bạn cũng có thể sử dụng các tùy chọn sau:

  • kernel_modules

    Danh sách các mục tiêu cho các mô -đun ngoài cây . Các mô -đun trong cây không nên được đưa vào đây. Tham khảo Chuẩn bị các mô-đun trong cây để trích xuất ký hiệu .

  • kmi_symbol_list_add_only

    Tùy chọn này ngăn chặn việc loại bỏ các ký hiệu không sử dụng. Chỉ được phép xóa biểu tượng tại những thời điểm cụ thể trong quá trình ổn định KMI và không được phép khi KMI bị đóng băng .

    Điều này cũng hữu ích khi bạn sử 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, nó sẽ không xóa các ký hiệu được sử dụng bởi thiết bị A chứ không phải thiết bị B.

  • module_grouping

    Nếu True hoặ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 mô-đun hạt nhân tham chiếu ký hiệu đó. Nếu không, danh sách ký hiệu sẽ chỉ là danh sách được sắp xếp các ký hiệu được sử dụng bởi tất cả các mô-đun hạt nhân.

Xem ví dụ 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,
)

Đồng thời xem tài liệu tham khảo về mục tiêu kernel_abi trong Kleaf.

Chuẩn bị các mô-đun trong cây để trích xuất ký hiệu

Để chuẩn bị các mô-đun trong cây cho việc 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_MODULEScách sử dụng nó để biết ví dụ. Không bao gồm các mô-đun GKI trong danh sách này.

Định cấu hình các mô-đun này thành không dấu , nếu không danh sách ký hiệu có thể trống. Để làm như vậy, hãy thêm dòng này vào đoạn cấu hình kernel của bạn:

# CONFIG_MODULE_SIG_ALL is not set

Xem ví dụ về common-modules/virtual-device/virtual_device_core.fragment .

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 thiết bị BUILD.bazel . Tên của danh sách ký hiệu phải có định dạng //common:android/abi_gki_<arch>_<device> . Xem common-modules/virtual-device/BUILD.bazel , ví dụ:

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,
)

Tạo và gửi danh sách biểu tượng ban đầu

Tạo danh sách biểu tượng trống tại common/android/abi_gki_<arch>_<device> . Đối với ví dụ trên, lệnh sẽ là:

touch common/android/abi_gki_aarch64_virtual_device

Thêm tệp này vào additional_kmi_symbol_lists của bản dựng hạt nhân GKI cơ sở. Ví dụ: //common:android/abi_gki_aarch64_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 vào danh sách ký hiệu mới và gửi nó đến kho lưu trữ Android Common Kernel.

Cập nhật danh sách biểu tượng thiết bị

Tất cả các ký hiệu hạt nhân lõi được sử dụng bởi các mô-đun trong module_outs của kernel_buildkernel_modules của kernel_abi phải được đưa vào danh sách ký hiệu. Điều này có thể được thực hiện 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 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_list

Gửi bản cập nhật danh sách biểu tượng tới ACK

Gửi bản vá có thay đổi danh sách biểu tượng tới Android Common Kernel gerrit để biến các biểu tượng mới 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 được thêm hoặc xóa. Bạn có thể viết danh sách này theo cách thủ công để cập nhật danh sách ký hiệu nhỏ hoặc sử dụng báo cáo $DIST_DIR/abi.report.short sau khi cập nhật biểu diễn ABI tham chiếu .

Mặc dù không cần phải cập nhật biểu diễn ABI tham chiếu trước khi gửi bản cập nhật danh sách ký hiệu nhưng nó có thể loại bỏ các bước gửi trước bổ sung và giúp thay đổi sẵn sàng gửi nhanh hơn. Trong mọi trường hợp, nó sẽ được kiểm tra và cập nhật nếu cần thiết trong quá trình gửi trước.

Phiên bản cũ hơn (Android 12 trở xuống)

Sử dụng công cụ build_abi.sh như sau:

BUILD_CONFIG=path/to/build.config.device build/build_abi.sh --update-symbol-list

Trong ví dụ này, build.config.device phải bao gồm các tùy chọn cấu hình sau:

  • vmlinux

    Phải là một phần của danh sách FILES . Điều này có thể được thực hiện bằng cách thêm build.config.aarch64 .

  • KMI_SYMBOL_LIST

    Phải được đặt và trỏ vào danh sách ký hiệu KMI để 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 biểu tượng được cập nhật vào common/android/abi_gki_aarch64_<device> .

  • Kiểm tra xem android/abi_gki_aarch64_<device> có được bao gồm trong ADDITIONAL_KMI_SYMBOL_LISTS trong common/build.config.gki.aarch64 hay không.

  • Gửi bản cập nhật danh sách biểu tượng tới ACK .