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
và .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:
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ệnIFoo
trong tệpIFoo.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ả proxyHwBinder
(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 khaiIFoo
và mô tả Triển khai giao diện mã giả lậpHwBinder
(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ả proxyHwBinder
và Mã giả lậpHwBinder
. 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.
Liên kết đến thư viện chia sẻ
Ứ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
libhidltransport và
libhwbinder
|
---|---|
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>
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 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++ là
::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