Garagenmodus

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

Was ist der Garagenmodus?

Auf verbundenen Geräten wie Telefonen verlassen sich Benutzer darauf, dass das System sicherstellt, dass die Geräte stabil, aktuell und optimiert sind. Um diesen Zustand zu erreichen, stellt die Android-Plattform ein Leerlaufzeitfenster bereit, in dem Apps Aufgaben ausführen können, wenn der Benutzer nicht mit dem Gerät interagiert. Ein Telefon gilt als im Leerlauf , 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 ist ein Auto ausgeschaltet, wenn es nicht benutzt wird, was bedeutet, dass das Auto kein Zeitfenster für Leerlaufzeiten 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, ist das System eingeschaltet, das Display ausgeschaltet und inaktive Jobs in der JobScheduler Warteschlange werden ausgeführt. Informationen zum Implementieren des Garagenmodus finden Sie in den Richtlinien zur Geräteimplementierung .

Richtlinien zur Geräteimplementierung

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

Damit der Status SHUTDOWN_PREPARE wirksam wird, muss der VHAL die beiden Parameter (Status und den zusätzlichen Parameter) für den Befehl AP_POWER_STATE_REQ angeben. Dadurch kann das Gerät in den Garagenmodus wechseln, der geplante Jobs im JobScheduler erkennt und verhindert, dass das System entweder anhält oder herunterfährt, 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, woraufhin das System heruntergefahren wird. Unter bestimmten, im CDD definierten Umständen können Geräteimplementierungen das System früher herunterfahren. Einzelheiten zu den Android-Kompatibilitätsanforderungen finden Sie im Android Compatibility Definition Document (CDD) .

Wenn der VHAL das System herunterfahren muss, bevor der Garagenmodus abgeschlossen ist, kann der VHAL SHUTDOWN_PREPARE ausgeben, wobei der Parameter auf SHUTDOWN_IMMEDIATELY oder SLEEP_IMMEDIATELY gesetzt ist. Geräteimplementierungen können dies nur unter bestimmten Umständen verwenden, typischerweise wenn die Ressourcen, die zum Betrieb des Systems erforderlich sind, nicht verfügbar sind. Zum Beispiel, wenn die Batteriekapazität nicht ausreicht.

Garagenmodus

Abbildung 1. Ablauf im Garagenmodus

Wie arbeiten App-Entwickler mit dem Garagenmodus?

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

Der folgende Code zeigt, wie Sie die Ausführung eines Jobs im Garagenmodus planen:

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

Debug-Garage-Modus

So debuggen Sie den Garagenmodus:
  1. So aktivieren Sie Protokollierungskategorien, die für den Garagenmodus relevant sind:
    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 startet:
    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 ermitteln 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 sicherzustellen, 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