Implémentation de référence

Nous fournissons une implémentation de référence pour l'interface AIDL VHAL. Le thread de service principal est implémenté à 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. Dans la couche supérieure, DefaultVehicleHal, implémente l'interface AIDL VHAL et fournit une logique VHAL générique pour tous les appareils matériels. Dans la couche inférieure, FakeVehicleHardware, implémente l'interface IVehicleHardware. Cette classe simule la logique VHAL d'interaction avec le matériel ou le bus de véhicule réel, et est spécifique à l'appareil. Les fournisseurs peuvent également adapter cette architecture, réutiliser la même classe DefaultVehicleHal (en l'étendant pour remplacer une méthode) et fournir leur propre implémentation IVehicleHardware.

Implémentation de référence VHAL
Figure 1. Implémentation de référence VHAL

DefaultVehicleHal contient la logique suivante, qui est considérée comme générique et peut s'appliquer à n'importe quelle implémentation VHAL.

  • Implémente l'interface IVehicle.
  • Effectue des vérifications d'entrée de base, y compris une vérification des ID en double.
  • Alloue des objets clients (par exemple, GetValuesClient) pour chaque opération de chaque client de binder et ajoute chacun d'eux à un pool global.
  • Gère la logique des rappels asynchrones, par exemple en ajoutant une requête en attente à un pool de requêtes en attente. Résout les requêtes en attente lorsque nous recevons les résultats ou renvoie une erreur lorsque l'une des requêtes en attente expire.
  • Sérialise et désérialise LargeParcelable (voir ParcelableUtils.h).
  • Gère l'abonnement (voir SubscriptionManager.h).
  • Vérifie les autorisations. (Consultez les checkReadPermission et checkWritePermission fonctions.)
  • Appelle régulièrement IVehicleHardware.checkHealth et envoie des signaux de pulsation (voir la checkHealth fonction).

IVehicleHardware est une interface générique utilisée pour représenter l'implémentation spécifique au matériel d'une interface 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. Elle est conçue pour s'exécuter sur un émulateur et ne présente aucune dépendance matérielle spécifique. Les implémentations des fournisseurs ne doivent pas l'utiliser telle quelle et doivent ajouter une logique spécifique au bus de véhicule.

À partir d'Android 14, FakeVehicleHardware lit la configuration de propriété compatible 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. Pour connaître le format et le contenu du fichier de configuration, consultez le fichier README de référence VHAL.

FakeVehicleHardware est également compatible avec le remplacement du fichier de configuration pour les tests. Si la propriété système persist.vendor.vhal_init_value_override est définie (cette propriété doit être définie au moment de la compilation ou très tôt au démarrage avant l’initialisation de VHAL), 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 de propriété compatible avec VHAL- ne soit pas codée en dur et puisse être décidée de manière dynamique au démarrage. La liste des configurations de propriété du véhicule doit être statique une fois VHAL initialisé.

À partir d'Android 16, GRPCVehicleHardware fournit une autre implémentation IVehicleHardware de référence. Cette implémentation suppose qu'un serveur distinct s'exécute sur une machine ou une VM distante et contient la logique de gestion des propriétés. L'interface VHAL exécutée sur les appareils AAOS fait office de proxy qui transfère les requêtes au serveur distant. Pour en savoir plus, consultez grpc.