Fornecemos uma implementação de referência para o AIDL VHAL. O thread de serviço principal é implementado em VehicleService.cpp
. A implementação da interface VHAL está localizada em DefaultVehicleHal.cpp
.
A implementação de referência é baseada em uma arquitetura de duas camadas. Na camada superior, DefaultVehicleHal
, implementa a interface VHAL AIDL e fornece lógica VHAL genérica para todos os dispositivos de hardware. Na camada inferior, FakeVehicleHardware
implementa a interface IVehicleHardware
. Esta classe simula a lógica VHAL de interação com o hardware real ou barramento do veículo e é específica do dispositivo. Opcionalmente, os fornecedores podem adaptar essa mesma arquitetura, reutilizar a mesma classe DefaultVehicleHal
(estendendo-a para substituir um método) e fornecer sua própria implementação IVehicleHardware
.
DefaultVehicleHal
contém a seguinte lógica, que é considerada genérica e pode ser aplicada a qualquer implementação VHAL.
- Implementa a interface
IVehicle
. - Executa verificações básicas de entrada, incluindo uma verificação de IDs duplicados.
- Aloca objetos de cliente (por exemplo,
GetValuesClient
) para cada operação de cada cliente fichário e adiciona cada um a um pool global. - Gerencia a lógica de retornos de chamada assíncronos, como adicionar uma solicitação pendente a um pool de solicitações pendentes. Resolve solicitações pendentes quando recebemos os resultados ou retorna erro quando uma das solicitações pendentes expira.
- Serializa e desserializa
LargeParcelable
(consulteParcelableUtils.h
). - Gerencia assinatura (consulte
SubscriptionManager.h
). - Verifica as permissões. (Veja as funções
checkReadPermission
echeckWritePermission
). - Chama IVehicleHardware.checkHealth periodicamente e envia sinais de pulsação (consulte a função
checkHealth
).
IVehicleHardware
é uma interface genérica usada para representar uma implementação específica de hardware de um VHAL. A implementação de referência para IVehicleHardware
é FakeVehicleHardware
, que usa um mapa na memória para armazenar o valor da propriedade e não se comunica com um barramento de veículo real. Ele foi projetado para ser executado em um emulador e não possui dependências específicas de hardware. As implementações do fornecedor não devem usá-lo como estão e devem adicionar lógica específica ao barramento do veículo.
No Android 14, FakeVehicleHardware
lê a configuração da propriedade suportada em tempo de execução durante a inicialização da pasta /vendor/etc/automotive/vhalconfig/
do dispositivo, que contém um arquivo de configuração no estilo JSON. Consulte o arquivo VHAL README de referência para obter o formato do arquivo de configuração e o conteúdo do arquivo de configuração.
FakeVehicleHardware
também suporta substituição de arquivo de configuração para teste. Se a propriedade do sistema persist.vendor.vhal_init_value_override
estiver definida, ele usará o arquivo de configuração da pasta /vendor/etc/automotive/vhaloverride/
no dispositivo para substituir a configuração existente. Uma implementação de fornecedor pode usar uma abordagem semelhante para que a configuração de propriedade suportada por VHAL não seja codificada e possa ser decidida dinamicamente no momento do início. A configuração da propriedade do veículo deve ser estática quando o dispositivo for iniciado.