Garagenmodus

Im Garage-Modus bleibt das System aktiv, damit Jobs in JobScheduler, die durch Inaktivität eingeschränkt sind, ausgeführt werden können.

Was ist der Garagenmodus?

Bei verbundenen Geräten wie Smartphones verlassen sich Nutzer darauf, dass das System dafür sorgt, dass die Geräte stabil, auf dem neuesten Stand und optimiert sind. Um diesen Zustand zu erreichen, bietet die Android-Plattform einen Inaktivitätszeitraum, in dem Apps Aufgaben ausführen können, wenn der Nutzer nicht mit dem Gerät interagiert. Ein Smartphone gilt als inaktiv, wenn der Nutzer es über einen längeren Zeitraum (60 Minuten oder mehr) nicht berührt und das Display ausgeschaltet ist. Im Gegensatz zu einem Smartphone wird ein Auto ausgeschaltet, wenn es nicht verwendet wird. Das bedeutet, dass es keinen Inaktivitätszeitraum hat. Der Garagenmodus sorgt für eine Ruhezeit im Auto.

Wenn ein Auto vom Nutzer ausgeschaltet wird, wechselt das System in den Garagenmodus. Wenn sich ein Auto im Garagenmodus befindet, ist das System eingeschaltet, das Display aus und inaktive Jobs in der JobScheduler-Warteschlange werden ausgeführt. Informationen zur Implementierung des Garagenmodus finden Sie in den Richtlinien zur Geräteimplementierung.

Richtlinien für die Geräteimplementierung

Wenn Sie das Fahrzeug ausschalten, muss die Vehicle HAL (VHAL) AP_POWER_STATE_REQ mit dem Status SHUTDOWN_PREPARE senden, wobei der Parameter auf SHUTDOWN_ONLY oder CAN_SLEEP festgelegt ist, um den Garagenmodus zu aktivieren.

Damit der Status SHUTDOWN_PREPARE wirksam ist, müssen in der VHAL die beiden Parameter (Status und zusätzlicher Parameter) für den Befehl AP_POWER_STATE_REQ angegeben werden. Dadurch kann das Gerät in den Garagenmodus wechseln, der geplante Jobs in JobScheduler erkennt und verhindert, dass das System bis zum Abschluss der Jobs angehalten oder heruntergefahren wird.

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

Im Garagenmodus fordert das Framework die VHAL auf, die Zeit bis zum Herunterfahren zu verlängern, bis entweder die erforderliche Dauer überschritten oder alle Jobs ausgeführt wurden. In diesem Fall wird das System heruntergefahren. Unter bestimmten in der Geräteanforderungen-Dokumentation (CDD) definierten Umständen können Geräteimplementierungen das System früher herunterfahren. Weitere Informationen zu den Android-Kompatibilitätsanforderungen finden Sie im Compatibility Definition Document (CDD).

Wenn der VHAL das System herunterfahren muss, bevor der Garagenmodus abgeschlossen ist, kann er SHUTDOWN_PREPARE mit dem Parameter SHUTDOWN_IMMEDIATELY oder SLEEP_IMMEDIATELY senden. Geräteimplementierungen können diese Funktion nur unter bestimmten Umständen verwenden, in der Regel, wenn die für den Betrieb des Systems erforderlichen Ressourcen nicht verfügbar sind. Beispielsweise, wenn die Akkukapazitä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 in JobScheduler. Diese Jobs, die durch Inaktivität eingeschränkt sind, werden im Garagenmodus ausgeführt.

Im folgenden Code wird gezeigt, wie ein Job 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());

Debug-Modus für Garage

So beheben Sie Probleme mit dem 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 prüfen Sie in der Logcat-Ausgabe, ob 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 ermitteln Sie anhand der Logcat-Ausgabe, ob der Garagenmodus beendet wurde (abgebrochen oder abgeschlossen):
    [GarageMode]: GarageMode was canceled
    oder
    [GarageMode]: GarageMode completed normally

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

  4. Prüfen Sie anhand der Logcat-Ausgabe, ob die richtigen Energiesparzustä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