Garagenmodus

Um Leerlaufzeiten in Fahrzeugen bereitzustellen, hält der Garagenmodus das System wach, damit Jobs im JobScheduler , die durch Leerlauf eingeschränkt sind, ausgeführt werden können.

Was ist der Garagenmodus?

Auf angeschlossenen Geräten wie Telefonen verlassen sich die Benutzer auf das System, um sicherzustellen, dass die Geräte stabil, aktuell und optimiert sind. Um diesen Zustand zu erreichen, bietet die Android-Plattform ein Leerlaufzeitfenster , in dem Anwendungen Aufgaben ausführen können, wenn der Benutzer nicht mit dem Gerät interagiert. Ein Telefon gilt als inaktiv , wenn der Benutzer es über einen längeren Zeitraum (60 Minuten oder länger) nicht berührt und der Bildschirm ausgeschaltet ist. Im Gegensatz zu einem Telefon wird ein Auto ausgeschaltet, wenn es nicht benutzt wird, was bedeutet, dass das Auto kein Leerlaufzeitfenster hat . Der Garagenmodus sorgt für Leerlaufzeiten im Auto.

Wenn ein Auto vom Benutzer ausgeschaltet wird, wechselt das System in den Garagenmodus. Während sich ein Auto im Garagenmodus befindet, wird das System eingeschaltet, das Display ausgeschaltet und inaktive Jobs in der JobScheduler-Warteschlange ausgeführt. Informationen zum Implementieren des Garagenmodus finden Sie unten in den Richtlinien zur Geräteimplementierung.

Richtlinien zur Geräteimplementierung

Um den Garagenmodus zu aktivieren, muss die Fahrzeug-HAL (VHAL) beim Abstellen des Fahrzeugs AP_POWER_STATE_REQ mit dem Zustand SHUTDOWN_PREPARE senden, wobei der Parameter auf SHUTDOWN_ONLY oder CAN_SLEEP .

Damit der Zustand SHUTDOWN_PREPARE wirksam wird, muss die VHAL die beiden Parameter (Zustand und der zusätzliche Parameter) für den Befehl AP_POWER_STATE_REQ . Dadurch kann das Gerät in den Garagenmodus wechseln, der geplante Jobs im JobScheduler erkennt und verhindert, dass das System entweder angehalten oder heruntergefahren wird, bis die Jobs abgeschlossen sind.

Wie stellen Geräteimplementierungen eine Verbindung zum Android-Framework her?

Für den Garagenmodus fordert das Framework die VHAL auf, die Abschaltzeit zu verlängern, bis entweder die erforderliche Dauer überschritten ist oder alle Jobs ausgeführt wurden, zu welchem ​​Zeitpunkt das System heruntergefahren wird. Unter bestimmten Umständen, die in der CDD definiert sind, können Geräteimplementierungen das System früher herunterfahren. (Einzelheiten zu den Android-Kompatibilitätsanforderungen finden Sie im Android Compatibility Definition Document (CDD) .) Wenn die VHAL das System herunterfahren muss, bevor der Garagenmodus abgeschlossen ist, kann die VHAL SHUTDOWN_PREPARE mit dem auf SHUTDOWN_IMMEDIATELY oder SLEEP_IMMEDIATELY festgelegten Parameter ausgeben. Geräteimplementierungen können dies nur unter bestimmten Umständen verwenden, in der Regel, wenn die Ressourcen, die erforderlich sind, um das System am Laufen zu halten, nicht verfügbar sind. Zum Beispiel, wenn die Batteriekapazität nicht ausreicht.

Garagenmodus

Wie arbeiten Anwendungsentwickler mit dem Garagenmodus?

Anwendungen und Dienste interagieren nicht direkt mit dem Garagenmodus. Stattdessen planen Apps Jobs im JobScheduler ein . Diese durch Leerlauf eingeschränkten Jobs werden im Garagenmodus ausgeführt.

Der folgende Code zeigt, wie ein Auftrag für die Ausführung im Garagenmodus geplant wird:

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());

Debuggen des Garagenmodus

So debuggen Sie den Garagenmodus:
  1. So aktivieren Sie für den Garagenmodus relevante Protokollierungskategorien:
    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. So überprüfen Sie die Logcat-Ausgabe, um anzuzeigen, dass der Garagenmodus gestartet wird:
    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. So bestimmen Sie, dass die Logcat-Ausgabe anzeigt, dass der Garagenmodus beendet (abgebrochen oder abgeschlossen) ist:
    [GarageMode]: GarageMode was canceled
    
    oder
    [GarageMode]: GarageMode completed normally
    

    Der Garagenmodus hängt wie oben beschrieben vom Energiezustand des Fahrzeugs ab.

  4. Überprüfen Sie die Logcat-Ausgabe, um anzuzeigen, dass die richtigen Energiezustände eingegeben wurden:
    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