Modalità garage

Per fornire periodi di inattività nei veicoli, la modalità Garage mantiene il sistema attivo in modo che i lavori in JobScheduler vincolati all'inattività possano essere eseguiti.

Cos'è la modalità Garage?

Sui dispositivi connessi come i telefoni, gli utenti si affidano al sistema per garantire che i dispositivi siano stabili, aggiornati e ottimizzati. Per raggiungere tale stato, la piattaforma Android fornisce una finestra di tempo di inattività durante la quale le app possono eseguire attività quando l'utente non interagisce con il dispositivo. Un telefono è considerato inattivo quando l'utente non lo tocca per un periodo prolungato (60 minuti o più) e lo schermo è spento. A differenza di un telefono, quando l'auto non viene utilizzata, è spenta, il che significa che l'auto non ha finestre di tempo di inattività . La modalità Garage garantisce tempi di inattività in macchina.

Quando l'auto viene spenta dall'utente, il sistema entra in modalità Garage. Mentre un'auto è in modalità Garage, il sistema è acceso, il display è spento e vengono eseguiti i lavori inattivi nella coda JobScheduler . Per implementare la modalità Garage, consulta le linee guida per l'implementazione del dispositivo .

Linee guida per l'implementazione del dispositivo

Per attivare la Modalità Garage, allo spegnimento del veicolo, l'HAL del veicolo (VHAL) deve inviare AP_POWER_STATE_REQ con lo stato SHUTDOWN_PREPARE con il parametro impostato su SHUTDOWN_ONLY o CAN_SLEEP .

Affinché lo stato SHUTDOWN_PREPARE sia effettivo, il VHAL deve specificare i due parametri (stato e parametro aggiuntivo) per il comando AP_POWER_STATE_REQ . Ciò consente al dispositivo di accedere alla modalità Garage, che rileva i lavori pianificati in JobScheduler e impedisce al sistema di procedere alla sospensione o allo spegnimento fino al completamento dei lavori.

In che modo le implementazioni dei dispositivi si collegano al framework Android?

Per la modalità Garage, il framework richiede al VHAL di estendere il tempo di spegnimento fino al superamento della durata richiesta o fino all'esecuzione di tutti i lavori, momento in cui il sistema si spegne. In circostanze specifiche definite nella CDD, le implementazioni dei dispositivi possono arrestare il sistema prima. Per dettagli sui requisiti di compatibilità Android, consulta il documento CDD (Android Compatibility Definition Document) .

Se il VHAL deve spegnere il sistema prima del completamento della modalità Garage, il VHAL può emettere SHUTDOWN_PREPARE con il parametro impostato su SHUTDOWN_IMMEDIATELY o SLEEP_IMMEDIATELY . Le implementazioni del dispositivo possono utilizzarlo solo in circostanze specifiche, in genere quando le risorse necessarie per mantenere il sistema in esecuzione non sono disponibili. Ad esempio, quando la capacità della batteria è insufficiente.

Modalità garage

Figura 1. Flusso della modalità Garage

Come lavorano gli sviluppatori di app con la modalità Garage?

Le app e i servizi non interagiscono direttamente con la modalità Garage. Invece, le app pianificano i lavori in JobScheduler . I lavori vincolati dall'inattività vengono eseguiti durante la modalità Garage.

Il codice seguente mostra come pianificare l'esecuzione di un lavoro durante la modalità Garage:

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

Modalità garage di debug

Per eseguire il debug della modalità Garage:
  1. Per abilitare le categorie di registrazione relative alla modalità Garage:
    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. Per rivedere l'output di logcat per indicare che la modalità Garage sta iniziando:
    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. Per determinare che l'output di logcat per indicare la modalità Garage è terminata (annullata o completata):
    [GarageMode]: GarageMode was canceled
    
    o
    [GarageMode]: GarageMode completed normally
    

    La modalità Garage dipende dallo stato di alimentazione del veicolo come descritto sopra.

  4. Esaminare l'output di logcat per indicare che sono stati immessi gli stati di alimentazione corretti:
    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