Мы предоставляем базовую реализацию 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 .