Mode garage

Pour fournir des périodes d'inactivité dans les véhicules, le mode Garage maintient le système éveillé afin que les tâches dans JobScheduler limitées par l'inactivité puissent être exécutées.

Qu'est-ce que le mode garage ?

Sur les appareils connectés tels que les téléphones, les utilisateurs s'appuient sur le système pour garantir que les appareils sont stables, à jour et optimisés. Pour atteindre cet état, la plate-forme Android fournit une fenêtre de temps d'inactivité pendant laquelle les applications peuvent effectuer des tâches lorsque l'utilisateur n'interagit pas avec l'appareil. Un téléphone est considéré comme inactif lorsque l'utilisateur ne le touche pas pendant une durée prolongée (60 minutes ou plus) et que l'écran est éteint. Contrairement à un téléphone, lorsqu'une voiture n'est pas utilisée, elle est éteinte, ce qui signifie qu'elle n'a pas de fenêtre de temps d'inactivité . Le mode garage garantit le temps d'inactivité dans une voiture.

Lorsqu'une voiture est éteinte par l'utilisateur, le système passe en mode garage. Lorsqu'une voiture est en mode garage, le système est sous tension, l'écran est éteint et les tâches inactives dans la file d'attente JobScheduler sont exécutées. Pour implémenter le mode Garage, consultez les directives de mise en œuvre des appareils .

Directives de mise en œuvre des appareils

Pour activer le mode garage, lors de l'arrêt du véhicule, le véhicule HAL (VHAL) doit envoyer AP_POWER_STATE_REQ avec l'état SHUTDOWN_PREPARE avec le paramètre réglé sur SHUTDOWN_ONLY ou CAN_SLEEP .

Pour que l'état SHUTDOWN_PREPARE soit effectif, le VHAL doit préciser les deux paramètres (état et paramètre supplémentaire) pour la commande AP_POWER_STATE_REQ . Cela permet à l'appareil d'entrer en mode Garage, qui détecte les tâches planifiées dans JobScheduler et empêche le système de procéder à une suspension ou à un arrêt jusqu'à ce que les tâches soient terminées.

Comment les implémentations d'appareils se connectent-elles au framework Android ?

Pour le mode Garage, le framework demande au VHAL de prolonger le temps d'arrêt jusqu'à ce que la durée requise soit dépassée ou que toutes les tâches aient été exécutées, moment auquel le système s'arrête. Dans des circonstances spécifiques définies dans le CDD, les implémentations de périphériques peuvent arrêter le système plus tôt. Pour plus de détails sur les exigences de compatibilité Android, consultez le document de définition de compatibilité Android (CDD) .

Si le VHAL doit arrêter le système avant la fin du mode garage, le VHAL peut émettre SHUTDOWN_PREPARE avec le paramètre défini sur SHUTDOWN_IMMEDIATELY ou SLEEP_IMMEDIATELY . Les implémentations de périphériques ne peuvent l'utiliser que dans des circonstances spécifiques, généralement lorsque les ressources nécessaires au fonctionnement du système ne sont pas disponibles. Par exemple, lorsque la capacité de la batterie est insuffisante.

Mode garage

Figure 1. Flux du mode Garage

Comment les développeurs d’applications travaillent-ils avec le mode Garage ?

Les applications et services n'interagissent pas directement avec le mode Garage. Au lieu de cela, les applications planifient les tâches dans JobScheduler . Les tâches limitées par l'inactivité sont exécutées en mode Garage.

Le code suivant montre comment planifier l'exécution d'une tâche en mode Garage :

public class MyGarageModeJob extends JobService { ... }

Context context = ...;
int jobId = ...;

ComponentName myGarageModeJobName = new componentName(context,
                                                      MyGarageModeJob.class);

JobInfo.Builder infoBuilder = new JobInfo.Builder(jobId, myGarageModeJobName)
                    .setRequiresDeviceIdle(true);

// Example of an optional constraint:
infoBuilder.setRequiredNetworkType(NetworkType.NETWORK_TYPE_UNMETERED);

JobScheduler jobScheduler = (JobScheduler) context
                    .getSystemService(Context.JOB_SCHEDULER_SERVICE);

jobScheduler.schedule(infoBuilder.build());

Mode garage de débogage

Pour déboguer le mode Garage :
  1. Pour activer les catégories de journalisation pertinentes pour le mode Garage :
    adb shell stop
    adb shell setprop log.tag.GarageMode VERBOSE
    adb shell setprop log.tag.Finsky VERBOSE
    adb shell setprop log.tag.CAR.POWER VERBOSE
    adb shell setprop log.tag.JobScheduler.Connectivity VERBOSE
    adb shell start
    
  2. Pour consulter la sortie logcat afin d'indiquer que le mode Garage démarre :
    GarageMode: [Controller]: CPM state changed to SHUTDOWN_PREPARE
    GarageMode: [GarageMode]: Entering GarageMode
    GarageMode: [Controller]: Sending broadcast with action: com.android.server.jobscheduler.GARAGE_MODE_ON
    
  3. Pour déterminer que la sortie logcat indique que le mode garage est terminé (annulé ou terminé) :
    [GarageMode]: GarageMode was canceled
    
    ou
    [GarageMode]: GarageMode completed normally
    

    Le mode garage dépend de l'état d'alimentation du véhicule, comme décrit ci-dessus.

  4. Examinez la sortie logcat pour indiquer que les états d'alimentation corrects sont saisis :
    CAR.POWER: starting shutdown prepare without Garage Mode
    GarageMode: [Controller]: CPM state changed to SHUTDOWN_PREPARE
    GarageMode: [GarageMode]: Entering GarageMode
    CAR.POWER: send shutdown prepare
    CAR.POWER: setPowerState=SHUTDOWN_PREPARE(7) param=0