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

Мы предоставляем эталонную реализацию для 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. Формат файла конфигурации и содержимое файла конфигурации см. в справочном файле VHAL README .

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

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