Implementação de referência

Fornecemos uma implementação de referência para a VHAL da AIDL. A linha de execução de serviço principal é implementada 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 AIDL VHAL e fornece a lógica VHAL genérica para todos os dispositivos de hardware. Na camada inferior, FakeVehicleHardware, implementa a interface IVehicleHardware. Essa classe simula a lógica VHAL de interagir com hardware real ou barramento de veículo e é específica do dispositivo. Os fornecedores também podem adaptar essa mesma arquitetura, reutilizar a mesma classe DefaultVehicleHal (estendendo-a para substituir um método) e fornecer a própria implementação de IVehicleHardware.

Implementação de referência VHAL
Figura 1. Implementação de referência do VHAL

DefaultVehicleHal contém a lógica a seguir, que é considerada genérica e pode ser aplicada a qualquer implementação do VHAL.

  • Implementa a interface IVehicle.
  • Realiza 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 de vinculação e adiciona cada um a um pool global.
  • Gerencia a lógica de callbacks 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 um erro quando uma das solicitações pendentes expira.
  • Serializa e desserializa LargeParcelable (consulte ParcelableUtils.h).
  • Gerencia a assinatura (consulte SubscriptionManager.h).
  • Verifica as permissões. Consulte as funções checkReadPermission e checkWritePermission.
  • Chama periodicamente IVehicleHardware.checkHealth e envia sinais de batimento cardíaco (consulte a função checkHealth).

IVehicleHardware é uma interface genérica usada para representar a implementação específica de hardware de uma 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 ônibus real. Ele é destinado a ser executado em um emulador e não tem dependências específicas de hardware. As implementações do fornecedor não podem usá-lo como está e precisam adicionar a lógica específica da bus do veículo.

No Android 14, FakeVehicleHardware lê a configuração de propriedade com suporte no tempo de execução durante a inicialização na pasta /vendor/etc/automotive/vhalconfig/ do dispositivo, que contém um arquivo de configuração no estilo JSON. Consulte o arquivo de referência README da VHAL para ver o formato e o conteúdo do arquivo de configuração.

O FakeVehicleHardware também oferece suporte à substituição do arquivo de configuração para testes. Se a propriedade do sistema persist.vendor.vhal_init_value_override estiver definida, ela usará o arquivo de configuração da pasta /vendor/etc/automotive/vhaloverride/ no dispositivo para substituir a configuração atual. Uma implementação do fornecedor pode usar uma abordagem semelhante para que a configuração de propriedade compatível com o VHAL não seja codificada e possa ser decidida dinamicamente no início. A configuração da propriedade do veículo precisa ser estática quando o dispositivo é iniciado.