Modo garaje

Para proporcionar períodos de tiempo de inactividad en los vehículos, el Modo Garaje mantiene el sistema activo para que se puedan ejecutar los trabajos en JobScheduler restringidos por inactividad .

¿Qué es el modo garaje?

En dispositivos conectados, como teléfonos, los usuarios confían en el sistema para garantizar que los dispositivos estén estables, actualizados y optimizados. Para lograr ese estado, la plataforma Android proporciona una ventana de tiempo de inactividad durante la cual las aplicaciones pueden realizar tareas cuando el usuario no interactúa con el dispositivo. Se considera que un teléfono está inactivo cuando el usuario no lo toca durante un período prolongado (60 minutos o más) y la pantalla está apagada. A diferencia de un teléfono, cuando un automóvil no está en uso, está apagado, lo que significa que el automóvil no tiene una ventana de tiempo de inactividad . El modo Garaje garantiza el tiempo de inactividad en el coche.

Cuando el usuario apaga un automóvil, el sistema ingresa al modo garaje. Mientras un automóvil está en modo garaje, el sistema se enciende, la pantalla se apaga y se ejecutan los trabajos inactivos en la cola JobScheduler . Para implementar el Modo Garaje, consulte Pautas de implementación del dispositivo .

Pautas de implementación del dispositivo

Para activar el Modo Garaje, al apagar el vehículo, el Vehículo HAL (VHAL) debe enviar AP_POWER_STATE_REQ con el estado SHUTDOWN_PREPARE con el parámetro establecido en SHUTDOWN_ONLY o CAN_SLEEP .

Para que el estado SHUTDOWN_PREPARE sea efectivo, el VHAL debe especificar los dos parámetros (estado y el parámetro adicional) para el comando AP_POWER_STATE_REQ . Esto permite que el dispositivo ingrese al Modo Garaje, que detecta trabajos programados en JobScheduler y evita que el sistema suspenda o apague hasta que se completen los trabajos.

¿Cómo se conectan las implementaciones de dispositivos al marco de Android?

Para el modo Garaje, el marco solicita a VHAL que extienda el tiempo de apagado hasta que se exceda la duración requerida o se hayan ejecutado todos los trabajos, momento en el cual el sistema se apaga. En circunstancias específicas definidas en el CDD, las implementaciones de dispositivos pueden apagar el sistema antes. Para obtener detalles sobre los requisitos de compatibilidad de Android, consulte el Documento de definición de compatibilidad de Android (CDD) .

Si el VHAL debe apagar el sistema antes de que se complete el Modo Garaje, el VHAL puede emitir SHUTDOWN_PREPARE con el parámetro establecido en SHUTDOWN_IMMEDIATELY o SLEEP_IMMEDIATELY . Las implementaciones de dispositivos pueden usar esto solo en circunstancias específicas, normalmente cuando los recursos necesarios para mantener el sistema en funcionamiento no están disponibles. Por ejemplo, cuando la capacidad de la batería es insuficiente.

Modo garaje

Figura 1. Flujo del modo garaje

¿Cómo trabajan los desarrolladores de aplicaciones con el modo Garaje?

Las aplicaciones y los servicios no interactúan directamente con el Modo Garaje. En cambio, las aplicaciones programan trabajos en JobScheduler . Los trabajos restringidos por la inactividad se ejecutan durante el modo Garaje.

El siguiente código muestra cómo programar un trabajo para que se ejecute durante el modo Garaje:

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

Modo de depuración de garaje

Para depurar el modo Garaje:
  1. Para habilitar categorías de registro relevantes para el modo Garaje:
    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. Para revisar la salida de logcat para indicar que se está iniciando el modo Garaje:
    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. Para determinar qué salida de logcat indica que el Modo Garaje ha finalizado (cancelado o completado):
    [GarageMode]: GarageMode was canceled
    
    o
    [GarageMode]: GarageMode completed normally
    

    El modo garaje depende del estado de energía del vehículo como se describe anteriormente.

  4. Revise la salida de logcat para indicar que se ingresaron los estados de energía correctos:
    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