Làm việc với danh sách biểu tượng

Để giảm số lượng biểu tượng và loại cần duy trì ở trạng thái ổn định, nhân GKI có khả năng giới hạn các biểu tượng được xuất chỉ ở những biểu tượng mà các 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 đã dùng để cho phép nhân GKI xuất các biểu tượng đó. Ví dụ: các biểu tượng mà các 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 biểu tượng do mục tiêu kernel_abi tạo ra. Thêm mục tiêu này vào BUILD.bazel của thiết bị bằng các lựa 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 thiết bị kernel_build.

Bạn cũng có thể sử dụng các lựa chọn sau:

  • kernel_modules

    Danh sách các mục tiêu cho các mô-đun out-of-tree. Bạn 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ị các mô-đun trong cây để trích xuất biểu tượng.

  • kmi_symbol_list_add_only

    Lựa chọn này ngăn việc xoá các biểu tượng không dùng đến. Bạn chỉ được phép xoá biểu tượng 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 được cố định.

    Đ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, bạn sẽ không xoá các biểu tượng mà thiết bị A dùng nhưng thiết bị B thì không.

  • module_grouping

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

Ví dụ: hãy xem 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ề đích 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. Để thực hiện việc này, hãy thêm dòng sau vào các đoạn cấu hình của nhân:

# CONFIG_MODULE_SIG_ALL is not set

Hãy xem common-modules/virtual-device/virtual_device_core.fragment để biết ví dụ.

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 ký hiệu phải có định dạng //common:gki/<arch>/symbols/<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:gki/aarch64/symbols/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/gki/<arch>/symbols/<device>. Đối với ví dụ trên, lệnh sẽ là:

touch common/gki/aarch64/symbols/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: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ữ Nhân chung của Android.

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

Tất cả các biểu tượng hạt nhân cốt lõi mà các mô-đun sử dụng trong module_outs của kernel_buildkernel_modules của kernel_abi đều phải có trong 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 sẽ 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 ký hiệu đến ACK

Gửi bản vá có thay đổi về danh sách biểu tượng đến Android Common Kernel gerrit để các biểu tượng mới trở thành một phần của KMI.

Thông báo cam kết phải có 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_stgdiff/abi.report.short sau khi cập nhật biểu diễn ABI tham chiếu.

Mặc dù không bắt buộc phải cập nhật biểu thị ABI tham chiếu trước khi gửi nội dung cập nhật danh sách biểu tượng, nhưng việc này có thể loại bỏ các bước bổ sung trước khi gửi và giúp bạn gửi thay đổ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 trong quá trình kiểm tra trước khi gửi.

Xử lý danh sách biểu tượng (Android 13)

Android 13 hỗ trợ cả Kleaf và các tập lệnh bản dựng cũ, vì vậy, bạn có thể quản lý danh sách biểu tượng như mô tả trong các phần trước hoặc như mô tả trong phần sau.

Thao tác với danh sách biểu tượng (Android 12 trở xuống)

Hãy 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 lựa 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 thêm build.config.aarch64.

  • KMI_SYMBOL_LIST

    Phải được đặt và trỏ đến danh sách biểu tượng 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):