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

Мы предоставляем базовую реализацию 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. Реализация IVehicleHardwareFakeVehicleHardware , которая использует карту памяти для хранения значений свойств и не взаимодействует с реальной шиной транспортного средства. Интерфейс предназначен для работы на эмуляторе и не имеет аппаратно-специфических зависимостей. Реализации поставщиков не должны использовать его «как есть» и должны добавлять логику, специфичную для шины транспортного средства.

Начиная с 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 .