Пакеты

За некоторыми исключениями, пакеты интерфейсов 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 в качестве входных данных, режим binderized имеет следующие автоматически сгенерированные файлы:

Файлы, созданные компилятором

Рисунок 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 ; все остальные файлы привязаны к механизму RPC HwBinder, используемому 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 имеет следующие качества:

  • Пространство имен С++ : ::android::hardware::mypackage::V1_2
  • Полное имя IMyInterface в этом пакете: ::android::hardware::mypackage::V1_2::IMyInterface . ( IMyInterface — это идентификатор, а не часть пространства имен).
  • Типы , определенные в файле types.hal пакета, идентифицируются как: ::android::hardware::mypackage::V1_2::MyPackageType