Пакеты

За редким исключением пакеты интерфейсов 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