Configurer l'accès à distance

Android 14 introduit la nouvelle fonctionnalité d'accès à distance, qui permet aux partenaires de réveiller Android à distance dans un véhicule pour exécuter des tâches spécifiques. Par exemple, pour exécuter le mode Garage pendant la nuit pour appliquer les mises à jour logicielles. Plusieurs composants non Android sont requis pour le flux de travail de bout en bout. Android ne définit ni ne fournit d'implémentation de composants non Android (cette responsabilité vous appartient).

Pour en savoir plus, consultez les sections suivantes :

Architecture

Le contenu suivant suppose que l’exemple d’architecture suivant est utilisé, ce qui est hypothétique et peut ne pas refléter l’architecture réelle. Les constructeurs OEM doivent adapter une implémentation réelle à leurs architectures de véhicules et de serveurs.

image

Figure 1. Exemple d'architecture.

L'exemple d'architecture se compose de ces composants matériels :

Composant matériel Description
Processeur d'application Processeur qui exécute Android. Android peut fonctionner sur la mémoire virtuelle (VM) (et non sur le matériel réel) sur ce processeur.
Processeur de véhicule Processeur chargé de contrôler l’alimentation du processeur de l’application.
Unité de contrôle télématique (TCU) Processeur dans le véhicule toujours capable de recevoir des messages à distance depuis le cloud. Le TCU est présumé être toujours allumé ou en mode faible consommation. Utilisez des messages à distance pour réveiller le TCU.
Serveur de réveil Un serveur distant qui fonctionne dans le cloud et est chargé de communiquer avec le TCU du véhicule pour émettre des commandes de réveil.
Serveur de tâches distant Le serveur de tâches distantes s'exécute dans le cloud, interagit avec les personnes et gère les tâches distantes.

L'exemple d'architecture se compose des composants logiciels suivants, qui fonctionnent tous sur Android :

Composant logiciel sur Android Description
Service automobile Service de structure AAOS qui fournit des API d'accès à distance.
Client de tâches distantes Une classe Service écrite par le fournisseur qui exécute des tâches à distance. Un système Android peut exécuter plusieurs clients de tâches à distance.
Accès à distance HAL Doit être implémenté pour l’accès à distance.
Couche d'abstraction pour la communication entre AAOS et un composant non Android tel que le TCU.

Les composants logiciels non Android sont décrits ci-dessous :

Composant logiciel non Android Description
Client de réveil Logiciel fonctionnant sur TCU qui maintient une connexion longue durée avec le serveur de réveil. Il maintient également une connexion avec le HAL d'accès à distance pour fournir des tâches à distance au service automobile.
Implémentation du serveur de réveil Serveur qui communique avec le client de réveil exécuté sur TCU. Peut envoyer des demandes de réveil au client de réveil.
Implémentation du serveur de tâches à distance Serveur qui gère les tâches à distance. Les utilisateurs interagissent avec ce serveur pour émettre et surveiller des tâches à distance.

Flux de travail

Cette section répertorie les étapes d'un exemple de flux de travail.

Exemple de flux de travail

Un flux de travail détaillé peut ressembler à ce qui suit :

  1. L'utilisateur gare son véhicule dans le garage.

  2. Le partenaire cherche à mettre à jour le véhicule du jour au lendemain lorsque les interactions avec le véhicule sont peu probables.

  3. Le serveur cloud partenaire envoie une tâche à distance de mise à jour du système au véhicule. Plus précisément, l'unité de commande télématique (TCU).

  4. Le TCU du véhicule réveille l'unité de commande électronique (ECU) Android et un service OEM déclenche le mode Garage.

  5. Android exécute le mode Garage pour télécharger et installer les mises à jour via Google Play.

  6. Après avoir appliqué la mise à jour, Android marque la tâche comme terminée et met fin à la connexion ou atteint un délai d'attente spécifié.

Flux de travail détaillé

Deux étapes importantes sont requises pour l’accès à distance. La première consiste à enregistrer le client, ce qui consiste à lier un utilisateur spécifique à un client de tâche à distance spécifique exécuté sur un véhicule spécifique. L'autre consiste à fournir une tâche, qui consiste à fournir la tâche à distance pour un utilisateur spécifique au client de tâche à distance spécifique exécuté sur le véhicule spécifique.

Enregistrer un client

Pour utiliser la fonctionnalité d'accès à distance, un utilisateur doit ouvrir l'application client de tâches à distance au moins une fois et terminer le processus d'enregistrement du client (le texte en gras indique les tâches implémentées par AAOS) :

  1. Au démarrage, Car Service obtient des informations sur le véhicule à partir du HAL d'accès à distance.

  2. Au démarrage, Car Service lance tous les clients de tâches distantes en fonction du filtre d'intention et de l'autorisation.

  3. Lors du démarrage du client de tâche à distance, le client de tâche à distance s'enregistre auprès du Car Service.

  4. Car Service informe le client de la tâche distante des informations d'enregistrement, y compris l'ID du véhicule et l'ID du client. L'identifiant client est unique et attribué par Car Service à ce client. Il est garanti qu'il sera unique parmi tous les clients de tâches à distance sur le même véhicule.

  5. L'utilisateur se connecte au serveur de tâches distantes via le client de tâches distantes et active la fonction d'accès à distance pour ce véhicule. Cette étape implique généralement une authentification via le serveur de tâches distant.

  6. Le client de tâche distante télécharge les informations de l'utilisateur ainsi que l'ID du véhicule et l'ID client sur le serveur de tâches distante et lui demande de lier l'utilisateur à ce client spécifique et à ce véhicule spécifique.

    En option, cette étape peut impliquer une authentification supplémentaire à deux facteurs de la part de l'utilisateur.

    Le serveur de tâches distant doit authentifier que l'ID du véhicule fourni dans la demande correspond à l'ID du véhicule de l'expéditeur, ce qui peut être fait via l'attestation du véhicule.

À moins qu'une réinitialisation d'usine n'ait lieu, le processus d'enregistrement du client est requis une fois par utilisateur et par véhicule. L'identifiant client est stocké localement dans le Car Service et reste le même pour le même client.

image

Figure 2. Enregistrez un client.

Désinscrire un client

Un utilisateur peut dissocier le véhicule de son compte soit depuis le véhicule, soit depuis le serveur de tâches distant :

  • Sur le véhicule , les utilisateurs peuvent ouvrir l'application client de tâche à distance et émettre une demande de dissociation pour dissocier ce véhicule de ses comptes d'utilisateurs précédemment liés.

  • Sur le serveur de tâches distant , les utilisateurs peuvent se connecter à leur compte et dissocier un véhicule précédemment lié de ce compte.

Si l'utilisateur dissocie le véhicule de son compte, le serveur de tâches distant doit supprimer la cartographie stockée pour l'utilisateur spécifique.

Livrer des tâches

Dans le nuage:

  1. Un utilisateur utilise le serveur de tâches distantes pour envoyer une tâche distante à un véhicule spécifique.

  2. Le serveur de tâches distant mappe l'ID utilisateur à l'ID du véhicule et à l'ID client. Il envoie les données de tâche, l'ID du véhicule et l'ID client au serveur de réveil.

  3. Le serveur de réveil trouve le TCU spécifique pour l'ID du véhicule (en supposant que l'enregistrement du TCU est déjà effectué) et envoie les données de tâche et l'ID client au TCU.

Sur le véhicule (le texte en gras indique les tâches effectuées par AAOS) :

  1. TCU reçoit des tâches distantes du serveur distant.

  2. Si le processeur d'application (AP) exécutant AAOS est éteint, TCU utilise le processeur du véhicule (VP) pour réveiller l'AP.

  3. Car Service reçoit des tâches de TCU.

  4. Car Service distribue les tâches au client de tâche distant correspondant.

  5. Le client de tâche distante reçoit et exécute la tâche.

    ( Facultatif ) Le client de tâche distant contacte le serveur de tâches pour plus de détails sur la tâche et exécute la tâche.

  6. ( Facultatif ) Le service client de tâches distantes signale le résultat de la tâche au serveur de tâches.

  7. Le client de tâche à distance informe Car Service lorsque la tâche est terminée.

  8. Si nécessaire, le Car Service rétablit l'état d'alimentation du véhicule.

image

Figure 3. Exécuter des tâches.

Écrire un client de tâche distante

CarRemoteAccessManager fournit l'API pour les fonctionnalités d'accès à distance. Pour en savoir plus, consultez CarRemoteAccessManager . Un client de tâches distantes est un service Android qui exécute des tâches distantes et utilise CarRemoteAccessManager . Cela nécessite PERMISSION_USE_REMOTE_ACCESS et PERMISSION_CONTROL_REMOTE_ACCESS et doit déclarer un filtre d'intention pour RemoteTaskClientService tel que :

<service android:name=".remoteaccess.RemoteTaskClientService"
         android:directBootAware="true"
         android:exported="true">
    <intent-filter>
       <action android:name="android.car.remoteaccess.RemoteTaskClientService" />
    </intent-filter>
</service>

Un client de tâche distante doit s'enregistrer auprès du Car Service lors de la création :

public final class RemoteTaskClientService extends Service {
    @Override
    public void onCreate() {
        // mCar = Car.createCar()...
        mRemoteAccessManager = (CarRemoteAccessManager)
            mcar.getCarManager(Car.CAR_REMOTE_ACCESS_SERVICE);
        if (mRemoteAccessManager == null) {
            // Remote access feature is not supported.
            return;
        }
        mRemoteAccessManager.setRemoteTaskClient(executor, mRemoteTaskClient);
    }
}

Il doit remplacer la fonction onBind pour renvoyer null.

@Override
public IBinder onBind(Intent intent) {
    return null;
}

Car Service gère son cycle de vie. Car Service se lie à ce service lors du démarrage et lorsqu'une tâche distante arrive. Car Service se dissocie de ce service une fois la tâche terminée. Pour en savoir plus, consultez Gestion du cycle de vie d'un service .

Le client de tâche distante s'exécute en tant qu'utilisateur système et n'a donc accès à aucune donnée spécifique à l'utilisateur.

L'exemple suivant montre comment gérer les rappels enregistrés :

private final class RemoteTaskClient
    implements CarRemoteAccessManager.RemoteTaskClientCallback {
    @Override
    public void onRegistrationUpdated(
        RemoteTaskClientRegistrationInfo info) {
        // Register to remote task server using info.
    }
    @Override
    public void onRemoteTaskRequested(String taskId,
        byte[] data, int remainingTimeSec) {
        // Parses the data and execute the task.
        // Report task result to remote task server.
        mRemoteAccessManager.reportRemoteTaskDone(taskId);
    }
    @Override
    public void onShutdownStarting(CompleteableRemoteTaskFuture future) {
        // Stop the executing task.
        // Clear the pending task queue.
        future.complete();
    }
}

Implémentation du fournisseur

La fonctionnalité d'accès à distance est facultative et désactivée par défaut. Pour activer la fonctionnalité, ajoutez un RRO tel que le suivant :

// res/xml/overlays.xml
<?xml version="1.0" encoding="utf-8"?>
<overlay>
    <item target="array/config_allowed_optional_car_features" value="@array/config_allowed_optional_car_features" />
</overlay>

// res/values/config.xml
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <string-array translatable="false" name="config_allowed_optional_car_features">
        <item>car_remote_access_service</item>
    </string-array>
</resources>

// Android.bp
runtime_resource_overlay {
    name: "RemoteAccessOverlay",
    resource_dirs: ["res"],
    manifest: "AndroidManifest.xml",
    sdk_version: "current",
    product_specific: true
}

Ou utilisez la commande adb suivante sur une build userdebug/eng :

adb shell cmd car_service enable-feature car_remote_access_service

Exigences sur Android

Accès à distance HAL

La couche d'abstraction matérielle d'accès à distance (HAL) est une couche d'abstraction implémentée par le fournisseur pour la communication entre AAOS et un autre ECU (par exemple, un TCU). Il est obligatoire pour prendre en charge la fonctionnalité d’accès à distance. Il n'est pas nécessaire de l'implémenter si la fonctionnalité d'accès à distance n'est pas implémentée.

L'interface est définie dans IRemoteAccess.aidl et inclut ces méthodes :

Classe Description
String getVehicleId() Obtient un identifiant de véhicule unique qui peut être reconnu par le serveur de réveil.
String getWakeupServiceName() Obtient le nom du serveur de réveil distant.
String getProcessorId() Obtient un ID de processeur unique qui peut être reconnu en réveillant le client.
void setRemoteTaskCallback(IRemoteTaskCallback callback)

Définit un rappel à appeler lorsqu'une tâche distante est demandée.

void clearRemoteTaskCallback() Efface un rappel de tâche à distance précédemment défini.
void notifyApStateChange(in ApState state)

Détecte si le processeur d'application est prêt à recevoir des tâches distantes.

L'interface de rappel est définie dans IRemoteTaskCallback.aid .

Classe Description
oneway void onRemoteTaskRequested(String clientId, in byte[] data)

Un rappel appelé lorsqu'une tâche distante est demandée.

Voir l' implémentation de référence avec une TCU externe. L'implémentation utilise un flux de lecture longue durée pour recevoir des tâches distantes et prend en charge la commande debug suivante :

dumpsys android.hardware.automotive.remoteaccess.IRemoteAccess/default

Véhicule HAL

Pour prendre en charge la fonctionnalité d'accès à distance, VHAL doit prendre en charge ces propriétés :

Classe Description
SHUTDOWN_REQUEST Demande l’arrêt de l’unité principale.
VEHICLE_IN_USE
  • Détecte si le véhicule est en cours d'utilisation.
  • Une fois que l'utilisateur a déverrouillé le véhicule ou lorsque l'utilisateur s'approche du véhicule. Cela devrait être true .
  • Une durée spécifique après que l'utilisateur a éteint le véhicule ou lorsque l'utilisateur a verrouillé le véhicule. Cela devrait être false .
  • Lorsque true , AAOS ne tente pas d'arrêter le véhicule lorsque la tâche à distance est terminée.

Pour en savoir plus, consultez Propriétés système prises en charge .

Mode silencieux

Le mode silencieux doit être pris en charge pour la fonction d'accès à distance afin que le véhicule puisse démarrer en mode silencieux pour exécuter des tâches à distance lorsqu'aucun utilisateur n'est présent. En mode silencieux, l'appareil AAOS démarre avec l'affichage et le son désactivés.

Le mode silencieux est contrôlé via deux fichiers sysfs du noyau Linux.

Classe Description
/sys/kernel/silent_boot/pm_silentmode_kernel_state

Représente le mode silencieux actuel.

/sys/kernel/silent_boot/pm_silentmode_hw_state

Représente le signal matériel pour définir un nouveau mode silencieux.

Le processeur du véhicule envoie un signal matériel au SoC Android pour activer/désactiver le mode silencieux. Le signal (0 ou 1) est écrit dans /sys/kernel/silent_boot/pm_silentmode_hw_state . Ensuite, le framework AAOS met à jour /sys/kernel/silent_boot/pm_silentmode_kernel_state en conséquence, ce qui représente le mode silencieux actuel. Les modules AAOS vérifient /sys/kernel/silent_boot/pm_silentmode_kernel_state pour savoir si le système est en mode silencieux ou non.

Lorsqu'une tâche à distance est reçue et qu'AAOS démarre, le processeur du véhicule définit le mode silencieux et démarre AAOS afin que le système démarre avec l'affichage/le son désactivé.

Composants non Android embarqués sur le véhicule

Processeur de véhicule

Le processeur du véhicule est un processeur installé dans le véhicule qui peut contrôler l'alimentation du processeur de l'application exécutant Android. Dans l'exemple d'architecture, TCU réveille le processeur de l'application en envoyant un signal au processeur du véhicule.

Composants non Android embarqués sur le véhicule

Le TCU du véhicule peut toujours recevoir des messages à distance.

Le client de réveil s'exécute sur la TCU pour garantir une connexion de longue durée avec le serveur de réveil distant.

L'AAOS exécuté sur l'AP peut communiquer avec le client de réveil exécuté sur le TCU via le HAL d'accès à distance.

image

Figure 4. TCU (client de réveil).

Composants sur le cloud

Serveur de réveil

Le serveur de réveil communique avec le client de réveil sur la TCU pour :

  • Maintenez une connexion durable avec le TCU du véhicule.
  • Recherchez un TCU spécifique en fonction de l'identifiant d'un véhicule.
  • Signaler l'état d'un véhicule. Par exemple, en ligne ou hors ligne, ou l'heure de la dernière connexion au serveur de tâches distant.

Dans une implémentation réelle, un serveur de réveil peut être fusionné avec un serveur de tâches distant.

Serveur de tâches distant

Le serveur de tâches distantes gère ces tâches distantes.

  • L'utilisateur interagit avec le serveur pour démarrer de nouvelles tâches à distance et surveiller les tâches à distance.

  • Utilise le serveur de réveil à distance pour réveiller le processeur d'application dans les véhicules.

  • Interagit avec le client de tâche à distance exécuté sur le véhicule.

  • Stocke les informations d’enregistrement des clients. Cela associe un utilisateur spécifique à un client de tâche à distance spécifique sur un véhicule spécifique.

Généralement, les données de tâche envoyées via le serveur de tâches distant au serveur de réveil, au TCU du véhicule et éventuellement au client de tâche distant sont simplement un ID de tâche. Le client de tâches distantes utilise l'ID de tâche pour récupérer les informations détaillées du serveur de tâches distantes.

Exigences de confidentialité et de sécurité

Tâche Condition Exigence
TCU (client de réveil) DOIT
  • Authentifiez le serveur de réveil.
  • Faites confiance au code.
Serveur de réveil DOIT
  • Autorisez uniquement les serveurs de tâches distants sur la liste autorisée à se connecter.
  • Authentifiez le client de réveil.
  • Envoyez le message de réveil au véhicule cible uniquement .
Client de tâches distantes DOIT
  • Authentifiez l'utilisateur lors de l'inscription.
  • Authentifiez le serveur de tâches distant.
  • Répondez à toutes les exigences de sécurité pour un service Android. Par exemple, des autorisations limitées.
Serveur de tâches distant DOIT
  • Doit authentifier le serveur de réveil.
  • Fournir une attestation du véhicule. Autrement dit, authentifiez que l'ID du véhicule fourni dans la demande correspond à l'ID du véhicule de l'expéditeur. Si l'attestation du véhicule n'est pas possible, doit utiliser d'autres moyens pour vérifier que l'utilisateur est actuellement propriétaire du véhicule.
  • Authentifier l'identité de l'utilisateur.
  • Répondez à toutes les exigences de sécurité pour un serveur qui gère les informations des utilisateurs.

Réinitialisation d'usine et transfert de propriété

Si un utilisateur effectue une réinitialisation d'usine, l'ID client stocké dans Car Service est effacé. Cependant, les serveurs (serveur de tâches distant et serveur de réveil distant) ne sont pas informés. Les serveurs conservent un mappage entre l'ID client désormais expiré et le véhicule. Par conséquent, si l'utilisateur démarre une nouvelle tâche à distance pour le véhicule, il utilise l'ID client expiré. Le véhicule est réveillé, mais la tâche distante ne peut pas être exécutée car le client de la tâche distante a un ID client différent qui ne correspond pas.

Ce qui suit décrit une implémentation possible pour une réinitialisation d'usine.

Lorsqu'un utilisateur effectue une réinitialisation d'usine, le fournisseur l'invite à se connecter au serveur de tâches distant et à dissocier le véhicule de son compte si l'utilisateur a déjà lié le véhicule. Il n'est pas garanti que l'appareil ait accès au réseau pendant la réinitialisation d'usine. Par conséquent, l’émission de la demande de dissociation au moment de la réinitialisation d’usine à partir de l’appareil peut ne pas être réalisable.

Chaque fois que la propriété d'un véhicule est transférée, certaines opérations doivent être effectuées pour garantir que l'ancien propriétaire ne puisse plus confier de tâches à distance au véhicule. Par exemple, il peut être demandé au nouveau propriétaire de :

  • Effectuez une réinitialisation d'usine. Cela garantit que l’ID client est régénéré. Après cette étape, l’ancien propriétaire peut toujours réveiller le véhicule, mais ne peut plus exécuter de tâches à distance.

  • Ouvrez l'application client de tâche à distance et suivez le processus Désinscrire un client pour dissocier le véhicule du compte du propriétaire précédent. Le nouveau propriétaire peut suivre le processus d'enregistrement d'un client pour lier le véhicule à son compte et remplacer le compte précédemment lié.

  • Le nouveau propriétaire peut utiliser le processus Enregistrer un client pour lier le véhicule à son compte et remplacer le compte précédemment lié.

Testez le client de tâche distante

Nous fournissons le répertoire default HAL d’accès à distance de référence pour tester les clients de tâches distantes. Vous pouvez utiliser la commande debug suivante pour injecter une fausse tâche distante dans HAL, qui est transmise à votre client de tâche distante si vous fournissez l'ID client correct. Vous pouvez obtenir l'ID client en enregistrant les informations d'enregistrement dans l'implémentation de votre client de tâche distante.

adb root && adb shell dumpsys android.hardware.automotive.remoteaccess.IRemoteAccess/default --inject-task [clientID] [taskData]