Внедрить USB HAL

В Android 8.0 обработка команд USB перенесена из скриптов init в собственный USB-демон для улучшения конфигурации и повышения надежности кода. Для настройки функций гаджетов используются скрипты init (триггеры свойств), которые выполняют операции, специфичные для конкретного устройства.

В предыдущих версиях эти специфические для устройства конфигурации достигались с помощью скриптов init , специфичных для устройства (с использованием триггеров свойств). Переход к архитектуре уровня аппаратной абстракции (HAL) обеспечивает гораздо более чистую реализацию, которая решает эти проблемы:

  1. Такие операции, как запись в узлы sysfs ядра, могут завершиться неудачей, но это не будет передано обратно в код фреймворка, который устанавливает свойство trigger. В результате фреймворк ошибочно предполагает, что операции прошли успешно, даже если они незаметно завершились неудачей.
  2. Скрипты init имеют ограниченное количество операций, которые могут быть выполнены.

В Android 12 добавлена ​​поддержка USB Gadget HAL для моделей управления сетью (NCM) и вызовов API, возвращающих как номер версии HAL, так и скорость USB. Для получения дополнительной информации о доступных вызовах API через USB HAL см. сводку пакета android.hardware.usb .

HAL и Treble

Специфические для устройства скрипты init использовались в качестве замены слоев HAL для выполнения специфических для устройства операций USB. USB (через ADB) является основным интерфейсом для отладки системных проблем. Наличие собственного демона для настройки USB устраняет зависимость от кода фреймворка, поэтому даже в случае сбоя фреймворка USB должен работать.

В модели Treble , также представленной в Android 8.0, все HAL-компоненты изолированы от системных служб и должны работать в собственных нативных демонах. Это устраняет необходимость в отдельном USB-демоне, поскольку слой HAL-компонентов прекрасно выполняет функцию USB-демона.

Стандартная реализация HAL обрабатывает все устройства, выпущенные до Android 8.0. Следовательно, для устройств, выпущенных до Android 8.0, не потребуется никакой работы, специфичной для конкретного устройства. Android 8.0 использует интерфейс HAL для запроса состояния USB-портов и для переключения ролей передачи данных и управления питанием.

Выполнение

На каждом устройстве, запускаемом под управлением Android 8.0, необходимо реализовать новый интерфейс USB HAL. Реализация по умолчанию должна учитывать устройства, выпущенные до Android 8.0. Реализация по умолчанию достаточна, если устройство использует класс dual_role_usb для сообщения о состоянии порта Type-C. Для передачи управления узлами Type-C системе могут потребоваться незначительные изменения в скриптах USB, специфичных для устройства.