Modo garaje

Para proporcionar períodos de inactividad en los vehículos, el modo de garaje mantiene activo el sistema para que se puedan ejecutar los trabajos en JobScheduler limitados por la 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 no se usa un automóvil, se apaga, lo que significa que el automóvil no tiene una ventana de tiempo de inactividad . El modo de garaje garantiza el tiempo de inactividad en un automóvil.

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

Directrices de implementación de dispositivos

Para activar el Modo Garaje, al apagar el vehículo, el HAL del Vehículo (VHAL) debe enviar AP_POWER_STATE_REQ con el estado SHUTDOWN_PREPARE con el parámetro configurado 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 de garaje, que detecta los trabajos programados en JobScheduler y evita que el sistema proceda a suspenderse o apagarse hasta que se completen los trabajos.

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

Para el modo de garaje, el marco solicita al 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 que se apagará el sistema. En circunstancias específicas definidas en la 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 de 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, generalmente 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

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

Las aplicaciones y los servicios no interactúan directamente con el modo de garaje. En su lugar, las aplicaciones programan trabajos en JobScheduler . Los trabajos limitados por la inactividad se ejecutan durante el modo de garaje.

El siguiente código muestra cómo programar un trabajo para que se ejecute durante el modo de 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());

Depuración del modo garaje

Para depurar el modo de garaje:
  1. Para habilitar las categorías de registro relevantes para el modo de 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 el modo de garaje se está iniciando:
    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 que la salida logcat indica que el modo de garaje está terminado (cancelado o completado):
    [GarageMode]: GarageMode was canceled
    
    o
    [GarageMode]: GarageMode completed normally
    

    El modo de 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