Gói

Ngoại trừ một số trường hợp, các gói giao diện HIDL nằm trong thư mục hardware/interfaces hoặc vendor/. Cấp cao nhất của hardware/interfaces liên kết trực tiếp đến không gian tên gói android.hardware; phiên bản là một thư mục con trong không gian tên gói (không phải giao diện).

Trình biên dịch hidl-gen biên dịch các tệp .hal thành một tập hợp các tệp .h.cpp. Từ các tệp được tạo tự động này, một thư viện dùng chung mà các hoạt động triển khai máy khách/máy chủ liên kết sẽ được tạo. Tệp Android.bp tạo thư viện dùng chung này được tập lệnh hardware/interfaces/update-makefiles.sh tạo tự động. Mỗi khi thêm một gói mới vào hardware/interfaces hoặc thêm/xoá tệp .hal vào/khỏi một gói hiện có, bạn phải chạy lại tập lệnh để đảm bảo thư viện dùng chung được tạo là mới nhất.

Ví dụ: tệp mẫu IFoo.hal phải nằm trong hardware/interfaces/samples/1.0. Tệp IFoo.hal mẫu tạo một giao diện IFoo trong gói samples (mẫu):

package android.hardware.samples@1.0;
interface IFoo {
    struct Foo {
       int64_t someValue;
       handle  myHandle;
    };

    someMethod() generates (vec<uint32_t>);
    anotherMethod(Foo foo) generates (int32_t ret);
};

Tệp đã tạo

Các tệp được tạo tự động trong gói HIDL được liên kết vào một thư viện dùng chung duy nhất có cùng tên với gói (ví dụ: android.hardware.samples@1.0). Thư viện dùng chung cũng xuất một tiêu đề duy nhất, IFoo.h, mà máy khách và máy chủ có thể đưa vào. Khi sử dụng trình biên dịch hidl-gen với tệp giao diện IFoo.hal làm dữ liệu đầu vào, chế độ liên kết sẽ có các tệp được tạo tự động sau:

Các tệp do trình biên dịch tạo

Hình 1. Các tệp do trình biên dịch tạo.

  • IFoo.h. Mô tả giao diện IFoo thuần tuý trong một lớp C++; lớp này chứa các phương thức và loại được xác định trong giao diện IFoo trong tệp IFoo.hal, được dịch sang các loại C++ nếu cần. Không chứa thông tin chi tiết liên quan đến cơ chế RPC (ví dụ: HwBinder) dùng để triển khai giao diện này. Lớp được đặt tên không gian với gói và phiên bản, ví dụ: ::android::hardware::samples::IFoo::V1_0. Cả ứng dụng khách và máy chủ đều bao gồm tiêu đề này: Ứng dụng khách để gọi các phương thức trên đó và máy chủ để triển khai các phương thức đó.
  • IHwFoo.h. Tệp tiêu đề chứa các nội dung khai báo cho các hàm chuyển đổi tuần tự các loại dữ liệu được dùng trong giao diện. Nhà phát triển không bao giờ được đưa tiêu đề của lớp này vào trực tiếp (tiêu đề này không chứa bất kỳ lớp nào).
  • BpHwFoo.h. Một lớp kế thừa từ IFoo và mô tả cách triển khai giao diện proxy HwBinder (bên máy khách). Nhà phát triển không bao giờ được tham chiếu trực tiếp đến lớp này.
  • BnHwFoo.h. Một lớp chứa tham chiếu đến hoạt động triển khai IFoo và mô tả hoạt động triển khai mã giả HwBinder (phía máy chủ) của giao diện. Nhà phát triển không bao giờ được tham chiếu trực tiếp đến lớp này.
  • FooAll.cpp. Một lớp chứa các phương thức triển khai cho cả proxy HwBinder và mô-đun HwBinder. Khi một ứng dụng khách gọi một phương thức giao diện, proxy sẽ tự động sắp xếp các đối số từ ứng dụng khách và gửi giao dịch đến trình điều khiển hạt nhân liên kết. Trình điều khiển này sẽ phân phối giao dịch đến mô-đun giả lập ở phía bên kia (sau đó gọi phương thức triển khai máy chủ thực tế).

Các tệp này có cấu trúc tương tự như các tệp do aidl-cpp tạo (để biết thông tin chi tiết, hãy xem phần "Chế độ truyền tải" trong Tổng quan về HIDL). Tệp duy nhất được tạo tự động độc lập với cơ chế RPC mà HIDL sử dụng là IFoo.h; tất cả các tệp khác đều liên kết với cơ chế RPC HwBinder mà HIDL sử dụng. Do đó, việc triển khai máy khách và máy chủ không bao giờ được tham chiếu trực tiếp đến bất kỳ nội dung nào khác ngoài IFoo. Để đạt được điều này, chỉ bao gồm IFoo.h và liên kết với thư viện chia sẻ được tạo.

Ứng dụng hoặc máy chủ sử dụng bất kỳ giao diện nào trong một gói phải bao gồm thư viện dùng chung của gói đó ở một (1) trong các vị trí sau:

  • Trong Android.mk:
    LOCAL_SHARED_LIBRARIES += android.hardware.samples@1.0
  • Trong Android.bp:
    shared_libs: [
        /* ... */
        "android.hardware.samples@1.0",
    ],

Các thư viện bổ sung mà bạn có thể cần thêm vào:

libhidlbase Bao gồm các loại dữ liệu HIDL tiêu chuẩn. Kể từ Android 10, tệp này cũng chứa tất cả các ký hiệu trước đây trong libhidltransportlibhwbinder.
libhidltransport Xử lý việc truyền các lệnh gọi HIDL qua nhiều cơ chế RPC/IPC. Android 10 ngừng sử dụng thư viện này.
libhwbinder Các ký hiệu dành riêng cho liên kết. Android 10 ngừng sử dụng thư viện này.
libfmq IPC hàng đợi thông báo nhanh.

Không gian tên

Các hàm và loại HIDL như Return<T>Void() được khai báo trong không gian tên ::android::hardware. Không gian tên C++ của một gói được xác định theo tên và phiên bản gói. Ví dụ: gói mypackage có phiên bản 1.2 trong hardware/interfaces có các đặc điểm sau:

  • Không gian tên C++::android::hardware::mypackage::V1_2
  • Tên đủ điều kiện của IMyInterface trong gói đó là: ::android::hardware::mypackage::V1_2::IMyInterface. (IMyInterface là một giá trị nhận dạng, không phải là một phần của không gian tên).
  • Các loại được xác định trong tệp types.hal của gói được xác định là: ::android::hardware::mypackage::V1_2::MyPackageType