За редким исключением пакеты интерфейсов HIDL находятся в каталоге hardware/interfaces или vendor/. Карты верхнего уровня hardware/interfaces напрямую сопоставляются с пространством имен пакета android.hardware, а версия является подкаталогом в пространстве имен пакета (а не интерфейса).
Компилятор hidl-gen компилирует файлы .hal в набор файлов .h и .cpp. На основе этих автоматически созданных файлов строится общая библиотека, с которой связываются реализации клиента и сервера.
Файл Android.bp, который создает эту общую библиотеку, автоматически генерируется скриптом hardware/interfaces/update-makefiles.sh. Каждый раз, когда вы добавляете новый пакет в hardware/interfaces или добавляете/удаляете файлы .hal в существующий пакет, вам необходимо повторно запустить скрипт, чтобы убедиться, что сгенерированная общая библиотека обновлена.
Например, образец файла IFoo.hal должен находиться в каталоге hardware/interfaces/samples/1.0. В примере файла IFoo.hal создается интерфейс IFoo в пакете 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); };
Сгенерированные файлы
Автоматически созданные файлы в пакете HIDL связаны в одну общую библиотеку с тем же именем, что и у пакета (например, android.hardware.samples@1.0). Общая библиотека также экспортирует один заголовок IFoo.h, который может быть включен клиентами и серверами. При использовании компилятора hidl-gen с файлом интерфейса IFoo.hal в качестве входных данных в режиме связывания автоматически генерируются следующие файлы:

Рисунок 1. Файлы, сгенерированные компилятором.
IFoo.h. Описывает чистый интерфейсIFooв классе C++. Содержит методы и типы, определенные в интерфейсеIFooв файлеIFoo.hal, при необходимости преобразованные в типы C++. Не содержит сведений о механизме RPC (например,HwBinder), используемом для реализации этого интерфейса. Класс имеет пространство имен, включающее пакет и версию, например::android::hardware::samples::IFoo::V1_0. Этот заголовок используется как клиентами, чтобы вызывать методы, так и серверами, чтобы реализовывать эти методы.IHwFoo.h– заголовочный файл, содержащий объявления функций, которые сериализуют типы данных, используемые в интерфейсе. Разработчикам не следует включать этот заголовок напрямую (он не содержит классов).BpHwFoo.h– класс, который наследует отIFooи описывает реализациюHwBinderпрокси-сервера (клиентская сторона) интерфейса. Разработчикам не следует ссылаться на этот класс напрямую.BnHwFoo.h. Класс, который содержит ссылку на реализациюIFooи описывает реализацию заглушкиHwBinder(на стороне сервера) интерфейса. Разработчикам не следует обращаться к этому классу напрямую.FooAll.cpp. Класс, который содержит реализации как для прокси-сервераHwBinder, так и для заглушкиHwBinder. Когда клиент вызывает метод интерфейса, прокси-сервер автоматически маршалирует аргументы от клиента и отправляет транзакцию драйверу ядра Binder, который доставляет транзакцию заглушке на другой стороне (которая затем вызывает фактическую реализацию сервера).
Файлы структурированы аналогично файлам, созданным aidl-cpp (подробности см. в разделе "Режим сквозной передачи" в Обзоре HIDL). Единственный автоматически созданный файл, который не зависит от механизма RPC, используемого HIDL, – это IFoo.h. Все остальные файлы связаны с механизмом RPC HwBinder, используемым HIDL. Поэтому в реализациях на стороне клиента и сервера не следует
напрямую ссылаться на что-либо, кроме IFoo. Для этого включите только IFoo.h и свяжите его со сгенерированной общей библиотекой.
Ссылки на общие библиотеки
Клиент или сервер, использующий любой интерфейс в пакете, должен включать общую библиотеку этого пакета в одно из следующих мест:
- В файле Android.mk:
LOCAL_SHARED_LIBRARIES += android.hardware.samples@1.0
- В файле Android.bp:
shared_libs: [ /* ... */ "android.hardware.samples@1.0", ],
Дополнительные библиотеки, которые может потребоваться включить:
libhidlbase |
Включает стандартные типы данных HIDL. В Android 10 этот шрифт также содержит все символы, которые ранее были в шрифтах libhidltransport и libhwbinder.
|
|---|---|
libhidltransport |
Управляет передачей вызовов HIDL через различные механизмы RPC/IPC. В Android 10 эта библиотека не поддерживается. |
libhwbinder |
Символы, относящиеся к определенному переплету. В Android 10 эта библиотека устарела. |
libfmq |
Быстрая очередь сообщений IPC. |
Пространства имен
Функции и типы HIDL, такие как Return<T> и Void(), объявляются в пространстве имен ::android::hardware.
Пространство имен C++ пакета определяется по названию и версии пакета.
Например, пакет mypackage версии 1.2 в каталоге hardware/interfaces имеет следующие характеристики:
- Пространство имен C++:
::android::hardware::mypackage::V1_2 - Полное имя
IMyInterfaceв этом пакете:::android::hardware::mypackage::V1_2::IMyInterface. (IMyInterface– это идентификатор, а не часть пространства имен). - Типы, определенные в файле
types.halпакета, идентифицируются следующим образом:::android::hardware::mypackage::V1_2::MyPackageType