Nous fournissons une implémentation de référence pour l'AIDL VHAL. Le thread de service principal est implémenté sur VehicleService.cpp
. L'implémentation de l'interface VHAL se trouve dans DefaultVehicleHal.cpp
.
L'implémentation de référence est basée sur une architecture à deux couches. Sur la couche supérieure, DefaultVehicleHal
, implémente l'interface VHAL AIDL et fournit une logique VHAL générique à tous les périphériques matériels. Sur la couche inférieure, FakeVehicleHardware
, implémente l'interface IVehicleHardware
. Cette classe simule la logique VHAL d'interaction avec le matériel réel ou le bus du véhicule et est spécifique au périphérique. En option, les fournisseurs peuvent adapter cette même architecture, réutiliser la même classe DefaultVehicleHal
(en l'étendant pour écraser une méthode) et fournir leur propre implémentation IVehicleHardware
.
DefaultVehicleHal
contient la logique suivante, qui est considérée comme générique et peut s'appliquer à toute implémentation de VHAL.
- Implémente l'interface
IVehicle
. - Effectue des vérifications de saisie de base, y compris une vérification des identifiants en double.
- Alloue des objets client (par exemple,
GetValuesClient
) pour chaque opération pour chaque client de classeur et les ajoute chacun à un pool global. - Gère la logique des rappels asynchrones, comme l'ajout d'une demande en attente à un pool de demandes en attente. Résout les demandes en attente lorsque nous recevons les résultats ou renvoie une erreur lorsque l'une des demandes en attente expire.
- Sérialise et désérialise
LargeParcelable
(voirParcelableUtils.h
). - Gère l'abonnement (voir
SubscriptionManager.h
). - Vérifie les autorisations. (Voir les fonctions
checkReadPermission
etcheckWritePermission
). - Appelle périodiquement IVehicleHardware.checkHealth et envoie des signaux de battement de cœur (voir la fonction
checkHealth
).
IVehicleHardware
est une interface générique utilisée pour représenter l'implémentation spécifique au matériel d'un VHAL. L'implémentation de référence pour IVehicleHardware
est FakeVehicleHardware
, qui utilise une carte en mémoire pour stocker la valeur de la propriété et ne communique pas avec un bus de véhicule réel. Il est destiné à fonctionner sur un émulateur et ne présente aucune dépendance spécifique au matériel. Les implémentations des fournisseurs ne doivent pas l'utiliser tel quel et doivent ajouter une logique spécifique au bus du véhicule.
Sous Android 14, FakeVehicleHardware
lit la configuration de propriété prise en charge au moment de l'exécution lors de l'initialisation à partir du dossier /vendor/etc/automotive/vhalconfig/
de l'appareil, qui contient un fichier de configuration de style JSON. Consultez le fichier de référence VHAL README pour connaître le format et le contenu du fichier de configuration.
FakeVehicleHardware
prend également en charge le remplacement du fichier de configuration pour les tests. Si la propriété système persist.vendor.vhal_init_value_override
est définie, elle utilise le fichier de configuration du dossier /vendor/etc/automotive/vhaloverride/
sur l'appareil pour remplacer la configuration existante. Une implémentation de fournisseur peut utiliser une approche similaire afin que la configuration des propriétés prises en charge par VHAL ne soit pas codée en dur et puisse être décidée dynamiquement au moment du démarrage. La configuration des propriétés du véhicule doit être statique une fois l'appareil démarré.