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.
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:- 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
- 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
- Aby określić, że tryb garażu został zakończony (anulowany lub ukończony):
lub[GarageMode]: GarageMode was canceled
[GarageMode]: GarageMode completed normally
Tryb garażu zależy od stanu zasilania pojazdu, jak opisano powyżej.
- 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