Tryb garażowy

Aby zapewnić okresy bezczynności pojazdów, tryb garażowy utrzymuje system w stanie czuwania, dzięki czemu można wykonywać zadania w JobScheduler ograniczone przez bezczynność .

Co to jest tryb garażowy?

Użytkownicy podłączonych urządzeń, takich jak telefony, polegają na systemie, który zapewnia stabilność, aktualność i optymalizację urządzeń. Aby osiągnąć ten stan, platforma Android zapewnia okno bezczynności , podczas którego aplikacje mogą wykonywać zadania, gdy użytkownik nie wchodzi w interakcję z urządzeniem. Telefon uznaje się za nieaktywny , jeśli użytkownik nie dotyka go przez dłuższy czas (60 minut lub dłużej), a ekran jest wyłączony. W przeciwieństwie do telefonu, gdy samochód nie jest używany, jest on wyłączony, co oznacza, że ​​nie ma okna czasowego bezczynności . Tryb garażowy zapewnia bezczynność w samochodzie.

Po wyłączeniu samochodu przez użytkownika system przechodzi w tryb garażowy. Gdy samochód znajduje się w trybie garażowym, system jest włączony, wyświetlacz jest wyłączony i wykonywane są bezczynne zadania w kolejce JobScheduler . Aby wdrożyć tryb garażowy, zobacz Wskazówki dotyczące wdrażania urządzenia .

Wytyczne dotyczące wdrażania urządzeń

Aby aktywować tryb garażowy, podczas wyłączania pojazdu, HAL pojazdu (VHAL) musi wysłać AP_POWER_STATE_REQ ze stanem SHUTDOWN_PREPARE z parametrem ustawionym na SHUTDOWN_ONLY lub CAN_SLEEP .

Aby stan SHUTDOWN_PREPARE był skuteczny, VHAL musi określić dwa parametry (stan i parametr dodatkowy) dla komendy AP_POWER_STATE_REQ . Dzięki temu urządzenie może wejść w tryb garażowy, który wykrywa zaplanowane zadania w JobScheduler i zapobiega zawieszaniu lub zamykaniu systemu do czasu zakończenia zadań.

W jaki sposób implementacje urządzeń łączą się ze strukturą Androida?

W przypadku trybu garażowego struktura żąda od VHAL przedłużenia czasu zamknięcia do momentu przekroczenia wymaganego czasu trwania lub wykonania wszystkich zadań, kiedy to system się wyłącza. W określonych okolicznościach określonych w dyrektywie CDD implementacje urządzeń mogą spowodować wcześniejsze zamknięcie systemu. Szczegółowe informacje na temat wymagań dotyczących zgodności z systemem Android można znaleźć w dokumencie definicji zgodności systemu Android (CDD) .

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

Tryb garażowy

Rysunek 1. Przebieg trybu garażowego

Jak twórcy aplikacji współpracują z trybem garażowym?

Aplikacje i usługi nie współdziałają bezpośrednio z trybem garażowym. Zamiast tego aplikacje planują zadania w JobScheduler . Zadania ograniczone przez bezczynność są wykonywane w trybie garażowym.

Poniższy kod pokazuje, jak zaplanować uruchomienie zadania w trybie garażowym:

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

Debuguj tryb garażowy

Aby debugować tryb garażowy:
  1. Aby włączyć kategorie rejestrowania odpowiednie dla trybu garażowego:
    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 przejrzeć dane wyjściowe logcat i wskazać, że rozpoczyna się tryb garażowy:
    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ć, czy dane wyjściowe logcat wskazują, że tryb garażowy został zakończony (anulowany lub zakończony):
    [GarageMode]: GarageMode was canceled
    
    lub
    [GarageMode]: GarageMode completed normally
    

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

  4. Przejrzyj dane wyjściowe logcat, aby wskazać, że wprowadzono 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