Мы предоставляем эталонную реализацию для 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. Формат файла конфигурации и содержимое файла конфигурации см. в справочном файле VHAL README .
FakeVehicleHardware
также поддерживает переопределение файла конфигурации для тестирования. Если установлено системное свойство persist.vendor.vhal_init_value_override
(это свойство должно быть установлено во время сборки или очень рано во время загрузки перед инициализацией VHAL), оно использует файл конфигурации из папки /vendor/etc/automotive/vhaloverride/
на устройстве для переопределения существующей конфигурации. Реализация поставщика может использовать аналогичный подход, чтобы поддерживаемая VHAL конфигурация свойств не была жестко запрограммирована и могла динамически определяться во время запуска. Список конфигураций свойств транспортного средства должен быть статическим после инициализации VHAL.
Начиная с Android 16, GRPCVehicleHardware
предоставляет другую реализацию IVehicleHardware
. Эта реализация предполагает наличие отдельного сервера, работающего на удаленной машине или виртуальной машине, которая содержит логику обработки свойств. VHAL, работающий на устройствах AAOS, действует как прокси-сервер, который пересылает запросы на удаленный сервер. Подробнее см. в grpc .