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
và .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:
Hình 1. Các tệp do trình biên dịch tạo.
IFoo.h
. Mô tả giao diệnIFoo
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ệnIFoo
trong tệpIFoo.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 proxyHwBinder
(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 khaiIFoo
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ả proxyHwBinder
và mô-đunHwBinder
. 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 liên kết đến thư viện dùng chung
Ứ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 libhidltransport và libhwbinder .
|
---|---|
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>
và 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++ là
::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