Gói

Với một số ngoại lệ, các gói giao diện HIDL được đặt trong hardware/interfaces hoặc thư mục vendor/ . Ánh xạ cấp cao nhất hardware/interfaces tới không gian tên gói android.hardware ; phiên bản là 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à việc triển khai máy khách/máy chủ liên kết dựa vào sẽ được xây dựng. Tệp Android.bp xây dựng thư viện dùng chung này được tạo tự động bởi tập lệnh hardware/interfaces/update-makefiles.sh . Mỗi khi bạn thêm gói mới vào hardware/interfaces hoặc thêm/xóa tệp .hal vào/khỏi 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 được cập nhật.

Ví dụ: tệp mẫu IFoo.hal phải được đặt ở hardware/interfaces/samples/1.0 . Tệp IFoo.hal mẫu tạo giao diện IFoo trong gói 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 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 , có thể được đưa vào bởi máy khách và máy chủ. Sử dụng trình biên dịch hidl-gen với tệp giao diện IFoo.hal làm đầu vào, chế độ liên kết có các tệp được tạo tự động sau:

Các tập tin được tạo bởi trình biên dịch

Hình 1. Các tệp được tạo bởi trình biên dịch
  • IFoo.h . Mô tả giao diện IFoo thuần túy trong lớp C++; nó chứa các phương thức và kiểu được xác định trong giao diện IFoo trong tệp IFoo.hal , được dịch sang các kiểu C++ khi cần thiết. Không chứa các chi tiết liên quan đến cơ chế RPC (ví dụ: HwBinder ) được sử dụng để triển khai giao diện này. Lớp này được đặt tên theo gói và phiên bản, ví dụ ::android::hardware::samples::IFoo::V1_0 . Cả máy khách và máy chủ đều bao gồm tiêu đề này: Máy 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 khai báo cho các hàm tuần tự hóa các kiểu dữ liệu được sử dụng trong giao diện. Các nhà phát triển không bao giờ nên đưa trực tiếp tiêu đề của anh ấy vào (nó 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ả việc triển khai giao diện proxy HwBinder (phía máy khách). Các nhà phát triển không bao giờ nên tham khảo trực tiếp lớp này.
  • BnHwFoo.h . Một lớp chứa tham chiếu đến việc triển khai IFoo và mô tả việc triển khai giao diện HwBinder sơ khai (phía máy chủ). Các nhà phát triển không bao giờ nên tham khảo trực tiếp lớp này.
  • FooAll.cpp . Một lớp chứa các phần triển khai cho cả proxy HwBinder và sơ khai HwBinder . Khi máy 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ừ máy 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 phần sơ khai ở phía bên kia (sau đó gọi 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 được tạo bởi aidl-cpp (để biết chi tiết, hãy xem "Chế độ truyền qua" trong Tổng quan về HIDL ). Tệp được tạo tự động duy nhất độc lập với cơ chế RPC được 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 HIDL sử dụng. 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ỳ điều gì 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 dùng chung đã tạo.

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

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

Thư viện bổ sung bạn có thể cần bao gồm:

libhidlbase Bao gồm các loại dữ liệu HIDL tiêu chuẩn. Bắt đầu từ Android 10, biểu tượng 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 tải các cuộc gọi HIDL qua các cơ chế RPC/IPC khác nhau. Android 10 không dùng nữa thư viện này.
libhwbinder Ký hiệu dành riêng cho chất kết dính. Android 10 không dùng nữa thư viện này.
libfmq IPC hàng đợi tin nhắn nhanh.

Không gian tên

Các hàm và kiểu 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 gói được xác định bởi 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 tính sau:

  • Không gian tên C++::android::hardware::mypackage::V1_2
  • Tên đầy đủ của IMyInterface trong gói đó là: ::android::hardware::mypackage::V1_2::IMyInterface . ( IMyInterface là mã định danh, 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