Gói

Với một vài ngoại lệ, gói giao diện HIDL được đặt trong hardware/interfaces hoặc thư mục vendor/. Chiến lược phát hành đĩa đơn hardware/interfaces bản đồ tầng cao nhất trực tiếp tới 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 tệp .h.cpp. Từ những nguồn được tạo tự động này gửi một thư viện dùng chung mà để tạo liên kết triển khai máy khách/máy chủ. Tệp Android.bp tạo thư viện dùng chung này là do hardware/interfaces/update-makefiles.sh tạo tự động tập lệnh. Mỗi khi bạn thêm một gói mới vào hardware/interfaces, hoặc thêm/xoá .hal tệp 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 đã tạo là đã cập nhật.

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

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 thành một tệp dùng chung duy nhất thư viện 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 đề, IFoo.h, có thể được đưa vào bởi ứng dụng khách và máy chủ. Sử dụng trình biên dịch hidl-gen với IFoo.hal tệp giao diện dưới dạng đầu vào, chế độ liên kết có tệp:

Tệp
do trình biên dịch tạo

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

  • IFoo.h. Mô tả IFoo thuần túy giao diện trong 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++ khi cần. Không chứa thông tin chi tiết liên quan đến Cơ chế RPC (ví dụ: HwBinder) được dùng để triển khai giao diện này. Ví dụ: Lớp không gian tên chứa gói và phiên bản ::android::hardware::samples::IFoo::V1_0. Cả máy khách và máy chủ bao gồm tiêu đề này: Ứng dụng khách cho các phương thức gọi trên đó và máy chủ cho triển khai các phương pháp đó.
  • IHwFoo.h. Tệp tiêu đề chứa phần khai báo cho các hàm chuyển đổi tuần tự kiểu dữ liệu dùng trong giao diện. Nhà phát triển không bao giờ được đưa trực tiếp tiêu đề của mình vào (tiêu đề này không được chứa ).
  • BpHwFoo.h. Một lớp kế thừa từ IFoo và mô tả proxy HwBinder (phía máy khách) phương thức triển khai giao diện. Nhà phát triển không bao giờ được tham chiếu đến lớp này trực tiếp.
  • BnHwFoo.h. Một lớp lưu giữ tham chiếu đến cách triển khai IFoo và mô tả Triển khai giao diện mã giả lập HwBinder (phía máy chủ). 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 cho cả proxy HwBinder và Mã giả lập HwBinder. Khi máy khách gọi một phương thức giao diện, proxy tự động sắp xếp các đối số từ ứng dụng và gửi giao dịch với 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ã giả lập trên phía bên kia (sau đó sẽ gọi quá trình 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 (để biết chi tiết, xem "Chế độ thông qua" trong Tổng quan về HiDL). Chỉ tệp đượ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 được liên kết với cơ chế HwBinder RPC được sử dụng của HIDL. Do đó, việc triển khai máy khách và máy chủ không bao giờ được đề cập 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 dựa vào dữ liệu được chia sẻ được tạo thư viện của bạn.

Ứ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 đó trong một (1) trong số các vị trí:

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

Bạn có thể cần thêm các thư viện bổ sung sau:

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

Không gian tên

Các kiểu và hàm HIDL, chẳng hạn 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 gói và phiên bản. 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 hoàn toàn đủ điều kiện của IMyInterface trong đó gói là: ::android::hardware::mypackage::V1_2::IMyInterface. (IMyInterface là 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