За некоторыми исключениями, пакеты интерфейсов 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 в пакете примеров :
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
. Когда клиент вызывает метод интерфейса, прокси-сервер автоматически маршалирует аргументы от клиента и отправляет транзакцию драйверу ядра связывателя, который доставляет транзакцию в заглушку на другой стороне (которая затем вызывает фактическую реализацию сервера).
Файлы структурированы аналогично файлам, созданным с помощью aidl-cpp
(подробнее см. «Режим сквозной передачи» в Обзоре HIDL ). Единственный автоматически сгенерированный файл, независимый от механизма RPC, используемого HIDL, — это IFoo.h
; все остальные файлы привязаны к механизму HwBinder RPC, используемому HIDL. Следовательно, реализации клиента и сервера никогда не должны напрямую ссылаться ни на что, кроме IFoo
. Для этого включите только IFoo.h
и создайте ссылку на созданную общую библиотеку.
Ссылка на общие библиотеки
Клиент или сервер, использующий какой-либо интерфейс в пакете, должен включать общую библиотеку этого пакета в одном (1) из следующих мест:
- В 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