Эталонная реализация

Мы предоставляем эталонную реализацию AIDL VHAL. Основной поток обслуживания реализован в файле VehicleService.cpp . Реализация интерфейса VHAL находится в файле DefaultVehicleHal.cpp .

Эталонная реализация основана на двухслойной архитектуре. На верхнем слое DefaultVehicleHal реализует интерфейс VHAL AIDL и предоставляет логику VHAL, общую для всех аппаратных устройств. На нижнем слое FakeVehicleHardware реализует интерфейс IVehicleHardware . Этот класс имитирует логику VHAL взаимодействия с реальным оборудованием или автомобильной шиной и является специфичным для каждого устройства. При желании производители могут адаптировать эту же архитектуру, повторно использовать тот же класс DefaultVehicleHal (расширив его для переопределения метода) и предоставить собственную реализацию IVehicleHardware .

Эталонная реализация VHAL
Рисунок 1. Эталонная реализация VHAL.

DefaultVehicleHal содержит следующую логику, которая считается универсальной и может применяться к любой реализации VHAL.

  • Реализует интерфейс IVehicle .
  • Выполняет базовые проверки входных данных, включая проверку на наличие повторяющихся идентификаторов.
  • Создает объекты клиента (например, GetValuesClient ) для каждой операции для каждого клиента связывателя и добавляет каждый из них в глобальный пул.
  • Управляет логикой асинхронных коллбэков, например, добавлением ожидающего запроса в пул ожидающих запросов. Разрешает ожидающие запросы после получения результатов или возвращает ошибку, если один из ожидающих запросов истекает по таймауту.
  • Выполняет сериализацию и десериализацию LargeParcelable (см. ParcelableUtils.h ).
  • Управляет подпиской (см. SubscriptionManager.h ).
  • Проверяет права доступа. (См. функции checkReadPermission и checkWritePermission ).
  • Периодически вызывает функцию IVehicleHardware.checkHealth и отправляет сигналы пульса (см. функцию checkHealth ).

IVehicleHardware — это универсальный интерфейс, используемый для представления аппаратно-специфической реализации VHAL. Эталонной реализацией для IVehicleHardware является FakeVehicleHardware , которая использует карту памяти для хранения значений свойств и не взаимодействует с реальной автомобильной шиной. Она предназначена для работы на эмуляторе и не имеет аппаратно-специфических зависимостей. Реализации от поставщиков не должны использовать её в неизмененном виде и должны добавить логику, специфичную для автомобильной шины.

Начиная с Android 14, FakeVehicleHardware считывает поддерживаемые параметры конфигурации во время выполнения при инициализации из папки /vendor/etc/automotive/vhalconfig/ устройства, которая содержит файл конфигурации в формате JSON. См. справочный файл README VHAL для получения информации о формате и содержимом файла конфигурации.

FakeVehicleHardware также поддерживает переопределение конфигурационного файла для тестирования. Если задано системное свойство persist.vendor.vhal_init_value_override (это свойство должно быть задано во время сборки или на очень раннем этапе загрузки до инициализации VHAL), оно использует конфигурационный файл из папки /vendor/etc/automotive/vhaloverride/ на устройстве для переопределения существующей конфигурации. Реализация от производителя может использовать аналогичный подход, чтобы поддерживаемая VHAL конфигурация свойств не была жестко закодирована и могла динамически определяться во время запуска. Список конфигураций свойств автомобиля должен оставаться статическим после инициализации VHAL.

Начиная с Android 16, GRPCVehicleHardware предоставляет еще одну эталонную реализацию IVehicleHardware . Эта реализация предполагает наличие отдельного сервера, работающего на удаленной машине или виртуальной машине, который содержит логику обработки свойств. VHAL, работающий на устройствах AAOS, выступает в качестве прокси, перенаправляющего запросы на удаленный сервер. Дополнительные сведения см. в документации grpc .