A partir de 27 de março de 2025, recomendamos usar android-latest-release em vez de aosp-main para criar e contribuir com o AOSP. Para mais informações, consulte Mudanças no AOSP.
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 da VHAL
para interagir com o hardware real ou o 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 a própria implementação de IVehicleHardware.
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 IVehicleHardware.checkHealth periodicamente 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 barramento de veículo 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
uma lógica específica da bus do veículo.
A partir do 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 README de referência do VHAL
para saber o formato e o conteúdo do arquivo de configuração.
FakeVehicleHardware também oferece suporte à substituição de arquivos de configuração para testes. Se a
propriedade do sistema persist.vendor.vhal_init_value_override estiver definida (essa propriedade precisa ser
definida no momento da build ou muito cedo durante a inicialização, antes da inicialização do VHAL), 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 lista de configurações de propriedade do veículo precisa ser estática depois que a VHAL for inicializada.
A partir do Android 16, o GRPCVehicleHardware
fornece outra implementação de referência IVehicleHardware. Essa implementação
pressupõe que há um servidor separado em execução em uma máquina remota ou VM que contém a lógica
de processamento da propriedade. O VHAL em execução em dispositivos AAOS funciona como um proxy que encaminha solicitações para
o servidor remoto. Consulte grpc
para mais detalhes.
O conteúdo e os exemplos de código nesta página estão sujeitos às licenças descritas na Licença de conteúdo. Java e OpenJDK são marcas registradas da Oracle e/ou suas afiliadas.
Última atualização 2025-07-26 UTC.
[[["Fácil de entender","easyToUnderstand","thumb-up"],["Meu problema foi resolvido","solvedMyProblem","thumb-up"],["Outro","otherUp","thumb-up"]],[["Não contém as informações de que eu preciso","missingTheInformationINeed","thumb-down"],["Muito complicado / etapas demais","tooComplicatedTooManySteps","thumb-down"],["Desatualizado","outOfDate","thumb-down"],["Problema na tradução","translationIssue","thumb-down"],["Problema com as amostras / o código","samplesCodeIssue","thumb-down"],["Outro","otherDown","thumb-down"]],["Última atualização 2025-07-26 UTC."],[],[],null,["# Reference implementation\n\nWe provide a\n[reference implementation](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/automotive/vehicle/aidl/impl/current)\nfor the AIDL VHAL. The main service thread is implemented\nat\n[`VehicleService.cpp`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/automotive/vehicle/aidl/impl/current/vhal/src/VehicleService.cpp).\nThe VHAL interface implementation is located at\n[`DefaultVehicleHal.cpp`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/automotive/vehicle/aidl/impl/current/vhal/src/DefaultVehicleHal.cpp).\n\n\nThe reference implementation is based on a two-layer architecture. On the upper layer,\n`DefaultVehicleHal`, implements VHAL AIDL interface and provides VHAL logic\ngeneric to all hardware devices. On the lower layer, `FakeVehicleHardware`,\nimplements the `IVehicleHardware` interface. This class simulates the VHAL logic\nof interacting with actual hardware or vehicle bus and is device-specific. Optionally, vendors\ncan adapt this same architecture, reuse the same `DefaultVehicleHal` class (extending\nit to overwrite a method), and provide their own `IVehicleHardware` implementation.\n**Figure 1.** VHAL reference implementation\n\n[`DefaultVehicleHal`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/automotive/vehicle/aidl/impl/current/vhal/src/DefaultVehicleHal.cpp)\ncontains the following logic, which is considered to be generic and can apply to any VHAL\nimplementation.\n\n- Implements the `IVehicle` interface.\n- Performs basic input checks, including a check for duplicate IDs.\n- Allocates client objects (for example, `GetValuesClient`) for each operation for each binder client, and adds each to a global pool.\n- Manages async callbacks logic, such as adding a pending request to a pending request pool. Resolves pending requests when we receive the results or returns error when one of the pending requests times out.\n- Serializes and deserializes `LargeParcelable` (see `ParcelableUtils.h`).\n- Manages subscription (see `SubscriptionManager.h`).\n- Checks permissions. (See the `checkReadPermission` and `checkWritePermission` functions).\n- Periodically calls `IVehicleHardware.checkHealth` and sends heartbeat signals (see the `checkHealth` function).\n\n[`IVehicleHardware`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/automotive/vehicle/aidl/impl/current/hardware/include/IVehicleHardware.h)\nis a generic interface used to represent a VHAL's hardware-specific\nimplementation. The reference implementation for `IVehicleHardware` is\n[`FakeVehicleHardware`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/automotive/vehicle/aidl/impl/current/fake_impl/hardware/src/FakeVehicleHardware.cpp),\nwhich uses an in-memory map to store property value and does\nnot communicate with an actual vehicle bus. It's intended to run on an emulator and have no\nhardware-specific dependencies. Vendor implementations must not use it as-is and must add\nvehicle bus-specific logic.\n\nStarting in Android 14, `FakeVehicleHardware` reads the supported property config at run-time\nduring initialization from the device's `/vendor/etc/automotive/vhalconfig/` folder,\nwhich contains a JSON-style config file. See the\n[reference VHAL README file](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/automotive/vehicle/aidl/impl/current/default_config/config/README.md)\nfor config file format and config file content.\n\n`FakeVehicleHardware` also supports config file override for testing. If the\nsystem property `persist.vendor.vhal_init_value_override` is set (this property must be\nset at build time or very early during boot before VHAL initialization), it uses the config\nfile from the `/vendor/etc/automotive/vhaloverride/` folder on the device to override\nthe existing configuration. A vendor implementation can use a similar approach so that the VHAL-\nsupported property configuration is not hard-coded and can be dynamically decided at start time.\nThe list of vehicle property configs must be static after VHAL is initialized.\n\nStarting in Android 16, [`GRPCVehicleHardware`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/automotive/vehicle/aidl/impl/current/grpc/GRPCVehicleHardware.cpp)\nprovides another reference `IVehicleHardware` implementation. This implementation\nassumes there is a separate server running on a remote machine or VM which contains the property\nhandling logic. The VHAL running on AAOS devices acts as a proxy that forwards requests to\nthe remote server. See [grpc](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/automotive/vehicle/aidl/impl/current/README.md#grpc)\nfor more details."]]