Kể từ ngày 27 tháng 3 năm 2025, bạn nên sử dụng android-latest-release thay vì aosp-main để xây dựng và đóng góp cho AOSP. Để biết thêm thông tin, hãy xem phần Thay đổi đối với AOSP.
Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang
Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.
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):
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ệ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 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:
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
Nội dung và mã mẫu trên trang này phải tuân thủ các giấy phép như mô tả trong phần Giấy phép nội dung. Java và OpenJDK là nhãn hiệu hoặc nhãn hiệu đã đăng ký của Oracle và/hoặc đơn vị liên kết của Oracle.
Cập nhật lần gần đây nhất: 2025-07-27 UTC.
[[["Dễ hiểu","easyToUnderstand","thumb-up"],["Giúp tôi giải quyết được vấn đề","solvedMyProblem","thumb-up"],["Khác","otherUp","thumb-up"]],[["Thiếu thông tin tôi cần","missingTheInformationINeed","thumb-down"],["Quá phức tạp/quá nhiều bước","tooComplicatedTooManySteps","thumb-down"],["Đã lỗi thời","outOfDate","thumb-down"],["Vấn đề về bản dịch","translationIssue","thumb-down"],["Vấn đề về mẫu/mã","samplesCodeIssue","thumb-down"],["Khác","otherDown","thumb-down"]],["Cập nhật lần gần đây nhất: 2025-07-27 UTC."],[],[],null,["# Packages\n\n| **Note:** This section uses sample `.hal` files to illustrate how HIDL language constructs map to C++.\n\nWith few exceptions, HIDL interface packages are located in\n`hardware/interfaces` or the `vendor/` directory. The\n`hardware/interfaces` top-level maps directly to the\n`android.hardware` package namespace; the version is a subdirectory\nunder the package (not interface) namespace.\n\nThe `hidl-gen` compiler compiles the `.hal` files into\na set of a `.h` and `.cpp` files. From these autogenerated\nfiles a shared library that client/server implementations link against is built.\nThe `Android.bp` file that builds this shared library is\nautogenerated by the `hardware/interfaces/update-makefiles.sh`\nscript. Every time you add a new package to `hardware/interfaces`, or\nadd/remove `.hal` files to/from an existing package, you must rerun\nthe script to ensure the generated shared library is up-to-date.\n\nFor example, the `IFoo.hal` sample file should be located in\n`hardware/interfaces/samples/1.0`. The sample\n`IFoo.hal` file creates an IFoo interface in the\n**samples** package: \n\n```c++\npackage android.hardware.samples@1.0;\ninterface IFoo {\n struct Foo {\n int64_t someValue;\n handle myHandle;\n };\n\n someMethod() generates (vec\u003cuint32_t\u003e);\n anotherMethod(Foo foo) generates (int32_t ret);\n};\n```\n\nGenerated files\n---------------\n\nAutogenerated files in a HIDL package are linked into a single shared\nlibrary with the same name as the package (for example,\n`android.hardware.samples@1.0`). The shared library also exports a\nsingle header, `IFoo.h`, which can be included by clients and\nservers. Using the `hidl-gen` compiler with the `IFoo.hal`\ninterface file as an input, binderized mode has the following autogenerated\nfiles:\n\n**Figure 1.** Files generated by compiler.\n\n- `IFoo.h`. Describes the pure `IFoo` interface in a C++ class; it contains the methods and types defined in the `IFoo` interface in the `IFoo.hal` file, translated to C++ types where necessary. **Doesn't contain** details related to the RPC mechanism (for example, `HwBinder`) used to implement this interface. The class is namespaced with the package and version, for example, `::android::hardware::samples::IFoo::V1_0`. Both clients and servers include this header: Clients for calling methods on it and servers for implementing those methods.\n- `IHwFoo.h`. Header file that contains declarations for functions that serialize data types used in the interface. Developers should never include his header directly (it doesn't contain any classes).\n- `BpHwFoo.h`. A class that inherits from `IFoo` and describes the `HwBinder` proxy (client-side) implementation of the interface. Developers should never refer to this class directly.\n- `BnHwFoo.h`. A class that holds a reference to an `IFoo` implementation and describes the `HwBinder` stub (server-side) implementation of the interface. Developers should never refer to this class directly.\n- `FooAll.cpp`. A class that contains the implementations for both the `HwBinder` proxy and the `HwBinder` stub. When a client calls an interface method, the proxy automatically marshals the arguments from the client and sends the transaction to the binder kernel driver, which delivers the transaction to the stub on the other side (which then calls the actual server implementation).\n\nThe files are structured similarly to the files generated by\n`aidl-cpp` (for details, see \"Passthrough mode\" in the\n[HIDL Overview](/docs/core/architecture/hidl)). The only\nautogenerated file that is independent of the RPC mechanism used by HIDL is\n`IFoo.h`; all other files are tied to the HwBinder RPC mechanism used\nby HIDL. Therefore, client and server implementations **should never\ndirectly refer to anything other than `IFoo`** . To achieve\nthis, include only `IFoo.h` and link against the generated shared\nlibrary.\n| **Note:** HwBinder is only one possible transport; new transports might be added in the future.\n\nLink to shared libraries\n------------------------\n\nA client or server that uses any interface in a package must include the\nshared library of that package in **one (1)** of the following\nlocations:\n\n- In **Android.mk** : \n\n ```c++\n LOCAL_SHARED_LIBRARIES += android.hardware.samples@1.0\n ```\n- In **Android.bp** : \n\n ```c++\n shared_libs: [\n /* ... */\n \"android.hardware.samples@1.0\",\n ],\n ```\n\nAdditional libraries you might need to include:\n\n| `libhidlbase` | Includes standard HIDL data types. Starting in Android 10, this also contains all of the symbols previously in `libhidltransport` and `libhwbinder`. |\n| `libhidltransport` | Handles the transport of HIDL calls over different RPC/IPC mechanisms. **Android 10 deprecates this library.** |\n| `libhwbinder` | Binder-specific symbols. **Android 10 deprecates this library.** |\n| `libfmq` | Fast Message Queue IPC. |\n|--------------------|------------------------------------------------------------------------------------------------------------------------------------------------------|\n\nNamespaces\n----------\n\nHIDL functions and types such as `Return\u003cT\u003e` and\n`Void()` are declared in namespace `::android::hardware`.\nThe C++ namespace of a package is determined by the package name and version.\nFor example, a package **mypackage** with version 1.2 under\n`hardware/interfaces` has the following qualities:\n\n- **C++ namespace** is `::android::hardware::mypackage::V1_2`\n- **Fully qualified name** of `IMyInterface` in that package is: `::android::hardware::mypackage::V1_2::IMyInterface`. (`IMyInterface` is an identifier, not part of the namespace).\n- **Types** defined in the package's `types.hal` file are identified as: `::android::hardware::mypackage::V1_2::MyPackageType`"]]