Modalità garage

Per garantire periodi di inattività nei veicoli, la modalità Garage mantiene attivo il sistema in modo che i job in JobScheduler con vincoli di inattività possano essere eseguiti.

Che cos'è la modalità Garage?

Sui dispositivi connessi, come gli smartphone, gli utenti si affidano al sistema per assicurarsi che i dispositivi siano stabili, aggiornati e ottimizzati. Per raggiungere questo stato, la piattaforma Android fornisce un intervallo di tempo di inattività durante il quale le app possono eseguire attività quando l'utente non interagisce con il dispositivo. Uno smartphone è considerato inattivo quando l'utente non lo tocca per un periodo di tempo prolungato (60 minuti o più) e lo schermo è spento. diversamente da uno smartphone, quando un'auto non è in uso, è spenta, il che significa che non ha un intervallo di tempo di inattività. La modalità Garage garantisce il tempo di inattività in un'auto.

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

Linee guida per l'implementazione dei dispositivi

Per attivare la modalità Garage, quando il veicolo viene spento, 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 efficace, il VHAL deve specificare i due parametri (stato e parametro aggiuntivo) per il comando AP_POWER_STATE_REQ. In questo modo, il dispositivo entra in modalità Garage, che rileva i job pianificati in JobScheduler e impedisce al sistema di procedere alla sospensione o allo spegnimento finché i job non sono stati completati.

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

Per la modalità Garage, il framework richiede al VHAL di estendere il tempo di spegnimento fino a quando la durata richiesta non viene superata o tutti i job sono stati eseguiti, momento in cui il sistema si spegne. In circostanze specifiche definite nel CDD, le implementazioni dei dispositivi possono spegnere il sistema prima. Per informazioni dettagliate sui requisiti di compatibilità Android, consulta il Compatibility Definition Document (CDD) di Android.

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

Modalità garage

Figura 1. Flusso della modalità Garage

Come funziona la modalità Garage per gli sviluppatori di app?

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

Il seguente codice mostra come pianificare l'esecuzione di un job 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 attivare le categorie di log pertinenti 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 esaminare l'output di logcat che indica l'avvio della modalità Garage:
    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 indichi che 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. Esamina l'output di logcat per verificare che siano stati inseriti 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