Мы предоставляем эталонную реализацию AIDL VHAL. Основной поток обслуживания реализован в файле VehicleService.cpp . Реализация интерфейса VHAL находится в файле DefaultVehicleHal.cpp .
Эталонная реализация основана на двухслойной архитектуре. На верхнем слое DefaultVehicleHal реализует интерфейс VHAL AIDL и предоставляет логику VHAL, общую для всех аппаратных устройств. На нижнем слое FakeVehicleHardware реализует интерфейс IVehicleHardware . Этот класс имитирует логику VHAL взаимодействия с реальным оборудованием или автомобильной шиной и является специфичным для каждого устройства. При желании производители могут адаптировать эту же архитектуру, повторно использовать тот же класс DefaultVehicleHal (расширив его для переопределения метода) и предоставить собственную реализацию IVehicleHardware .
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 .