Thao tác với danh sách biểu tượng

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

Thêm mục tiêu để tạo danh sách biểu tượng

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 BUILD.bazel của thiết bị bằng các tuỳ chọn sau:

  • name

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

  • kernel_build

    Phải 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 tuỳ chọn sau:

  • kernel_modules

    Danh sách các mục tiêu cho các mô-đun ngoài cây. Không nên đưa các mô-đun trong cây vào đây. Hãy tham khảo phần Chuẩn bị các mô-đun trong cây để trích xuất biểu tượng.

  • kmi_symbol_list_add_only

    Tuỳ chọn này ngăn việc xoá các biểu tượng không dùng đến. Chúng tôi chỉ cho phép xoá biểu tượng tại các thời điểm cụ thể trong quá trình ổn định KMI và không được phép sau 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, thao tác này sẽ không xoá các biểu tượng mà thiết bị A nhưng không phải thiết bị B sử dụng.

  • module_grouping

    Nếu là True hoặc chưa được chỉ định, thì danh sách biểu tượng sẽ nhóm các biểu tượng dựa trên mô-đun nhân tham chiếu đến biểu tượng. Nếu không, danh sách biểu tượng là một danh sách biểu tượng đã sắp xếp mà tất cả các mô-đun hạt nhân sử dụng.

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

Ngoài ra, hãy 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 biểu tượng

Để chuẩn bị các mô-đun trong cây cho quá trình trích xuất biểu tượng, 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. Hãy xem _VIRT_COMMON_MODULEScách sử dụng để 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 thành chưa ký, nếu không danh sách biểu tượng có thể trống. Để làm như vậy, hãy thêm dòng này vào các mảnh cấu hình nhân:

# CONFIG_MODULE_SIG_ALL is not set

Ví dụ: xem common-modules/virtual-device/virtual_device_core.fragment.

Thêm danh sách biểu tượng thiết bị vào bản dựng hạt nhân 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 biểu tượng phải ở đị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 một danh sách ký hiệu 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 danh sách ký hiệu mới và gửi danh sách đó đến kho lưu trữ Kernel Common của Android.

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

Tất cả biểu tượng nhân lõi mà các mô-đun trong module_outs của kernel_buildkernel_modules của kernel_abi sử dụng phải được đưa vào danh sách biểu tượng. 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 cập nhật danh sách biểu tượng cho //common-modules/virtual-device:virtual_device_aarch64:

tools/bazel run //common-modules/virtual-device:virtual_device_aarch64_abi_update_symbol_list

Gửi thông tin cập nhật danh sách biểu tượng đến ACK

Gửi một bản vá có thay đổi về danh sách biểu tượng đến Gerrit của Hạt nhân Android phổ biến để đưa các biểu tượng mới vào 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ể viết danh sách này theo cách thủ công để cập nhật danh sách biểu tượng nhỏ hoặc sử dụng báo cáo $DIST_DIR/abi.report.short sau khi cập nhật nội dung đại diện ABI tham chiếu.

Mặc dù không bắt buộc phải cập nhật nội dung đại diện ABI tham chiếu trước khi gửi bản cập nhật danh sách biểu tượng, nhưng việc này có thể giúp loại bỏ các bước trước khi gửi và giúp bạn gửi thay đổi nhanh hơn. Trong mọi trường hợp, chính sách này vẫn được kiểm tra và cập nhật (nếu cần) trong quá trình gửi trước khi gửi.

Các phiên bản cũ (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 tuỳ chọn cấu hình sau:

  • vmlinux

    Phải có trong danh sách FILES. Bạn có thể thực hiện việc này bằng cách đưa vào build.config.aarch64.

  • KMI_SYMBOL_LIST

    Phải được đặt và trỏ đến danh sách ký hiệu KMI để cập nhật.

Sau khi cập nhật danh sách biểu tượng 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):