Tryb garażowy

Aby zapewnić okresy bezczynności w pojazdach, tryb garażu utrzymuje system w stanie czuwania, dzięki czemu zadania JobScheduler ograniczone przez stan bezczynności mogą być wykonywane.

Czym jest tryb garażu?

W przypadku połączonych urządzeń, takich jak telefony, użytkownicy oczekują, że system będzie stabilny, aktualny i zoptymalizowany. Aby osiągnąć ten stan, platforma Android zapewnia okno czasu bezczynności, w którym aplikacje mogą wykonywać zadania, gdy użytkownik nie korzysta z urządzenia. Telefon jest uważany za nieaktywny, gdy użytkownik nie dotyka go przez dłuższy czas (co najmniej 60 minut) i ekran jest wyłączony. W odróżnieniu od telefonu, gdy samochód nie jest używany, jest wyłączony, co oznacza, że nie ma okna czasu bezczynności. Tryb garażu zapewnia czas bezczynności w samochodzie.

Gdy użytkownik wyłączy samochód, system przejdzie w tryb garażu. Gdy samochód jest w trybie garażu, system jest włączony, wyświetlacz jest wyłączony, a niewykonane zadania w kole JobScheduler są wykonywane. Aby wdrożyć tryb garażu, zapoznaj się z wytycznymi dotyczącymi implementacji urządzenia.

Wskazówki dotyczące implementacji na urządzeniach

Aby aktywować tryb garażu, podczas wyłączania pojazdu interfejs Vehicle HAL (VHAL) musi wysłać AP_POWER_STATE_REQ z wartością SHUTDOWN_PREPARE i parametrem SHUTDOWN_ONLY lub CAN_SLEEP.

Aby stan SHUTDOWN_PREPARE był skuteczny, VHAL musi określić 2 parametry (stan i parametr dodatkowy) dla polecenia AP_POWER_STATE_REQ. Umożliwia to urządzeniu przejście w tryb garażu, który wykrywa zaplanowane zadania w JobScheduler i zapobiega zawieszaniu lub wyłączaniu systemu, dopóki zadania nie zostaną ukończone.

Jak implementacje urządzeń łączą się z platformą Android?

W przypadku trybu garażu framework prosi VHAL o przedłużenie czasu wyłączenia do momentu, gdy wymagany czas zostanie przekroczony lub wszystkie zadania zostaną wykonane. Wtedy system się wyłączy. W określonych okolicznościach określonych w CDD implementacje urządzeń mogą wyłączać system wcześniej. Szczegółowe informacje o wymaganiach dotyczących zgodności z Androidem znajdziesz w dokumentie definicji zgodności (CDD).

Jeśli VHAL musi wyłączyć system przed zakończeniem trybu garażu, może wydać polecenie SHUTDOWN_PREPARE z parametrem ustawionym na SHUTDOWN_IMMEDIATELY lub SLEEP_IMMEDIATELY. Implementacje na urządzeniach mogą korzystać z tego tylko w określonych okolicznościach, na przykład wtedy, gdy zasoby potrzebne do działania systemu są niedostępne. na przykład gdy pojemność baterii jest niewystarczająca.

Tryb garażu

Rysunek 1. Tryb garażu

Jak deweloperzy aplikacji korzystają z trybu garażu?

Aplikacje i usługi nie wchodzą w bezpośrednią interakcję z trybem garażu. Zamiast tego aplikacje planują zadania w JobScheduler. Zadania ograniczone przez bezczynność są wykonywane w trybie garażu.

Poniższy kod pokazuje, jak zaplanować zadanie do wykonania w trybie garażu:

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

Tryb garażu debugowania

Aby debugować tryb garażu:
  1. Aby włączyć kategorie rejestrowania istotne w przypadku trybu garażu:
    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. Aby sprawdzić dane wyjściowe logcat, które wskazują, że tryb garażu się uruchamia:
    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. Aby określić, że tryb garażu został zakończony (anulowany lub ukończony):
    [GarageMode]: GarageMode was canceled
    lub
    [GarageMode]: GarageMode completed normally

    Tryb garażu zależy od stanu zasilania pojazdu, jak opisano powyżej.

  4. Sprawdź dane wyjściowe logcat, aby sprawdzić, czy zostały wprowadzone prawidłowe stany zasilania:
    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