hid
Скрипт запуска HID
Тип файла: приложение
Комментарии
Уровень аппаратной абстракции (HAL)
В Android 8.0 и более поздних версиях уровни нижнего уровня переписаны, чтобы принять новую, более модульную архитектуру. Устройства под управлением Android 8.0 и выше должны поддерживать HAL, написанные на HIDL, за некоторыми исключениями, перечисленными ниже. Эти HAL могут быть связующими или сквозными.
В Android 11 также поддерживаются HAL, написанные на AIDL.
Все HAL AIDL обезврежены.
Связанные HAL . HAL, выраженные на языке определения интерфейса HAL (HIDL) или языке определения интерфейса Android (AIDL). Эти HAL заменяют как обычные, так и устаревшие HAL, используемые в более ранних версиях Android. В Binderized HAL платформа Android и HAL взаимодействуют друг с другом с помощью вызовов связывания между процессами (IPC).
Все устройства, запускаемые с Android 8.0 или более поздней версии, должны поддерживать только связанные HAL.
Сквозные HAL . Обычные или устаревшие HAL с оболочкой HIDL. Эти HAL обертывают существующие HAL и могут обслуживать HAL в режимах связывания и того же процесса (сквозной).
Устройства, обновляющиеся до Android 8.0, могут использовать сквозные HAL.
Требования к режиму HAL
Устройство Пройти через Связанный
Запуск с Android 8.0 HAL, перечисленные в Passthrough HAL, должны быть сквозными. Все остальные HAL связаны (включая HAL, которые являются расширениями поставщика).
Обновление до Android 8.0 HAL, перечисленные в Passthrough HAL, должны быть сквозными. HAL, перечисленные в Binderized HAL, должны быть скреплены.
Все другие HAL, предоставляемые образом поставщика, могут быть в режиме сквозного ИЛИ связывания.
В устройстве, полностью совместимом с Treble, все они должны быть перевязаны.
https://source.android.com/docs/core/architecture/hidl
HIDL - язык определения интерфейса HAL
HIDL — язык описания интерфейса (IDL), определяющий интерфейс между HAL и
его пользователями.
HIDL позволяет указывать типы и вызовы методов, собранные в интерфейсы и пакеты.
В более широком смысле HIDL — это система для связи между кодовыми базами,
которые могут быть скомпилированы независимо друг от друга.
Начиная с Android 10, HIDL устарел, и Android переходит на повсеместное использование AIDL.
HIDL предназначен для межпроцессного взаимодействия (IPC).
HAL, созданные с помощью HDL, называются Binderized HAL, поскольку они могут
взаимодействовать с другими уровнями архитектуры с помощью вызовов межпроцессного
взаимодействия (IPC).
Binderized HAL запускаются в отдельном процессе от клиента, который их использует.
Для библиотек, которые должны быть связаны с процессом, также доступен сквозной режим
не поддерживается в Java).
HIDL определяет структуры данных и сигнатуры методов, организованные в интерфейсы
(аналогично классу), которые собираются в пакеты.
Синтаксис HIDL выглядит знакомым программистам на C++ и Java,
но с другим набором ключевых слов. HIDL также использует аннотации в стиле Java.
Терминология
binderized Указывает, что HIDL используется для удаленных вызовов процедур между процессами, реализованными с помощью механизма, подобного Binder. См. также прохождение .
callback, asynchronous Интерфейс, обслуживаемый пользователем HAL, передаваемый в HAL (с использованием метода HIDL) и вызываемый HAL для возврата данных в любое время.
callback, synchronous Возвращает данные из реализации метода HIDL сервера клиенту. Не используется для методов, возвращающих void или одно примитивное значение.
client Процесс, вызывающий методы определенного интерфейса. Процесс платформы HAL или Android может быть клиентом одного интерфейса и сервером другого. См. также прохождение .
extends Указывает интерфейс, который добавляет методы и/или типы к другому интерфейсу. Интерфейс может расширять только один другой интерфейс. Может использоваться для дополнительного приращения версии в пакете с тем же именем или для нового пакета (например, расширения поставщика) для создания более старого пакета.
generates Указывает метод интерфейса, возвращающий значения клиенту. Чтобы вернуть одно не примитивное значение или более одного значения, генерируется синхронная функция обратного вызова.
interface Коллекция методов и типов. Переведен в класс на C++ или Java. Все методы в интерфейсе вызываются в одном направлении: клиентский процесс вызывает методы, реализованные серверным процессом.
oneway При применении к методу HIDL указывает, что метод не возвращает значений и не блокируется.
package Коллекция интерфейсов и типов данных, разделяющих версию.
passthrough Режим dlopen , в котором сервер является разделяемой библиотекой, открытой клиентом. В сквозном режиме клиент и сервер — это один и тот же процесс, но разные кодовые базы. Используется только для переноса устаревших кодовых баз в модель HIDL. См. также Связанный .
server Процесс, реализующий методы интерфейса. См. также прохождение .
transport Инфраструктура HIDL, которая перемещает данные между сервером и клиентом.
version Версия пакета. Состоит из двух целых чисел, старшего и младшего. Второстепенные приращения версии могут добавлять (но не изменять) типы и методы.
HIDL-дизайн
Цель HIDL состоит в том, чтобы можно было заменить инфраструктуру Android без необходимости перестраивать HAL. HAL будут созданы поставщиками или производителями SOC и помещены в раздел /vendor на устройстве, что позволит заменить платформу Android в ее собственном разделе на OTA без перекомпиляции HAL.
Дизайн HIDL уравновешивает следующие проблемы:
Интероперабельность . Создавайте надежно взаимодействующие интерфейсы между процессами, которые могут быть скомпилированы с различными архитектурами, наборами инструментов и конфигурациями сборки. Интерфейсы HIDL имеют версии и не могут быть изменены после публикации.
Эффективность . HIDL пытается минимизировать количество операций копирования. Данные, определенные HIDL, доставляются в код C++ в стандартных структурах данных компоновки C++, которые можно использовать без распаковки. HIDL также предоставляет интерфейсы с общей памятью, и, поскольку RPC по своей природе несколько медленны, HIDL поддерживает два способа передачи данных без использования вызова RPC: общую память и быструю очередь сообщений (FMQ).
Интуитивно понятный . HIDL позволяет избежать сложных вопросов владения памятью, используя только параметры in для RPC (см. Язык определения интерфейса Android (AIDL) ); значения, которые не могут быть эффективно возвращены из методов, возвращаются через функции обратного вызова. Ни передача данных в HIDL для передачи, ни получение данных из HIDL не меняют владельца данных — право собственности всегда остается за вызывающей функцией. Данные должны сохраняться только на время работы вызываемой функции и могут быть уничтожены сразу после возврата из вызванной функции.
Использование сквозного режима
Чтобы обновить устройства с более ранними версиями Android до Android O, вы можете обернуть как обычные (и устаревшие) HAL в новый интерфейс HIDL, который обслуживает HAL в режимах связывания и того же процесса (сквозной). Эта оболочка прозрачна как для HAL, так и для платформы Android.
Транзитный режим доступен только для клиентов и реализаций C++. Устройства, работающие под управлением более ранних версий Android, не имеют HAL, написанных на Java, поэтому Java HAL по своей сути связаны.
Сквозные заголовочные файлы
Когда файл .hal компилируется, hidl-gen создает дополнительный сквозной заголовочный файл BsFoo.h в дополнение к заголовкам, используемым для связи с связующим; этот заголовок определяет функции, которые необходимо dlopen . Поскольку сквозные HAL выполняются в том же процессе, в котором они вызываются, в большинстве случаев сквозные методы вызываются прямым вызовом функции (тот же поток). oneway методы выполняются в своем собственном потоке, поскольку они не предназначены для ожидания обработки их HAL (это означает, что любой HAL, использующий oneway методы в сквозном режиме, должен быть потокобезопасным).
Учитывая IFoo.hal , BsFoo.h оборачивает методы, сгенерированные HIDL, чтобы предоставить дополнительные функции (например, выполнение oneway транзакций в другом потоке). Этот файл похож на BpFoo.h , однако вместо того, чтобы передавать вызовы IPC с помощью связующего, нужные функции вызываются напрямую. Будущие реализации HAL могут предоставлять несколько реализаций, таких как FooFast HAL и FooAccurate HAL. В таких случаях будет создан файл для каждой дополнительной реализации (например, PTFooFast.cpp и PTFooAccurate.cpp ).
Связывание сквозных HAL
Вы можете связать реализации HAL, которые поддерживают сквозной режим. Учитывая интерфейс HAL abcd@MN::IFoo , создаются два пакета:
abcd@MN::IFoo-impl . Содержит реализацию HAL и предоставляет функцию IFoo* HIDL_FETCH_IFoo(const char* name) . На устаревших устройствах этот пакет открывается, и реализация HIDL_FETCH_IFoo dlopen Вы можете сгенерировать базовый код, используя hidl-gen и -Lc++-impl и -Landroidbp-impl .
abcd@MN::IFoo-service . Открывает сквозной HAL и регистрирует себя в качестве службы связывания, позволяя использовать одну и ту же реализацию HAL как для сквозного, так и для связывания.
Учитывая тип IFoo , вы можете вызвать sp<IFoo> IFoo::getService(string name, bool getStub) , чтобы получить доступ к экземпляру IFoo . Если getStub имеет значение true, getService пытается открыть HAL только в сквозном режиме. Если getStub имеет значение false, getService пытается найти службу с привязкой; если это не удается, он пытается найти транзитную службу. Параметр getStub никогда не должен использоваться, кроме как в defaultPassthroughServiceImplementation . (Устройства, запускаемые с Android O, являются полностью привязанными устройствами, поэтому открытие службы в транзитном режиме запрещено.)
HIDL-грамматика
По своей структуре язык HIDL похож на C (но не использует препроцессор C). Все знаки препинания, не описанные ниже (кроме очевидного использования = и | ), являются частью грамматики.
Примечание. Дополнительные сведения о стиле кода HIDL см. в Руководстве по стилю кода .
/** */ указывает на комментарий к документации. Их можно применять только к объявлениям типов, методов, полей и значений перечисления.
/* */ указывает на многострочный комментарий.
// указывает комментарий до конца строки. Помимо // , новые строки такие же, как и любые другие пробелы.
В приведенном ниже примере грамматики текст от // до конца строки не является частью грамматики, а вместо этого является комментарием к грамматике.
[empty] означает, что термин может быть пустым.
после литерала или термина означает, что это необязательно.
... указывает на последовательность, содержащую ноль или более элементов с разделительной пунктуацией, как указано. В HIDL нет аргументов с переменным числом аргументов.
Запятые разделяют элементы последовательности.
Точка с запятой завершает каждый элемент, включая последний элемент.
ВЕРХНИЙ РЕГИСТР — это нетерминал.
italics — это семейство токенов, такое как integer или identifier (стандартные правила синтаксического анализа C).
constexpr — это константное выражение в стиле C (например, 1 + 1 и 1L << 3 ).
import_name — это имя пакета или интерфейса, определяемое, как описано в HIDL Versioning .
words в нижнем регистре являются литеральными токенами.