Modo de garaje

Para proporcionar períodos de inactividad en los vehículos, el modo de garaje mantiene el sistema despierto para que se puedan ejecutar las tareas en JobScheduler restringidas con inactividad.

¿Qué es el modo de cochera?

En los dispositivos conectados, como los teléfonos, los usuarios dependen del sistema para garantizar que los dispositivos sean estables, estén actualizados y optimizados. Para lograr ese estado, la plataforma de Android proporciona una ventana de tiempo inactivo durante la cual las apps pueden realizar tareas cuando el usuario no interactúa con el dispositivo. Un teléfono se considera 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 se usa, está apagado, lo que significa que no tiene un período de inactividad. El modo de garaje garantiza el tiempo de inactividad en un automóvil.

Cuando el usuario apaga un automóvil, el sistema entra en modo de garaje. Mientras un auto está en modo de cochera, el sistema está encendido, la pantalla está apagada y se ejecutan las tareas inactivas en la cola de JobScheduler. Para implementar el modo de garaje, consulta los Lineamientos de implementación de dispositivos.

Lineamientos para la implementación de dispositivos

Para activar el modo de garaje, cuando se apaga el vehículo, el sistema 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 eficaz, el VHAL debe especificar los dos parámetros (el estado y el parámetro adicional) para el comando AP_POWER_STATE_REQ. Esto permite que el dispositivo entre en el modo Garage, que detecta trabajos programados en JobScheduler y evita que el sistema suspenda o apague el dispositivo hasta que se completen los trabajos.

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

En el modo Garage, el framework solicita al VHAL que extienda el tiempo de apagado hasta que se supere la duración requerida o se ejecuten todas las tareas, momento en el que se apaga el sistema. 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, consulta el Documento de definición de compatibilidad (CDD) de Android.

Si el VHAL debe apagar el sistema antes de que se complete el modo de garaje, puede emitir SHUTDOWN_PREPARE con el parámetro configurado en SHUTDOWN_IMMEDIATELY o SLEEP_IMMEDIATELY. Las implementaciones de dispositivos pueden usar esto solo en circunstancias específicas, por lo general, 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 cochera

Figura 1: Flujo del modo de cochera

¿Cómo trabajan los desarrolladores de apps con el modo Garage?

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

En el siguiente código, se muestra cómo programar una tarea 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());

Modo de depuración del garaje

Para depurar el modo garaje, haz lo siguiente:
  1. Para habilitar las categorías de registro relevantes para el modo Garage, haz lo siguiente:
    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 el resultado de Logcat que indica que se está iniciando el modo de garaje, haz lo siguiente:
    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 de logcat indique que el modo de la cochera finalizó (se canceló o completó), haz lo siguiente:
    [GarageMode]: GarageMode was canceled
    o
    [GarageMode]: GarageMode completed normally

    El modo de garaje depende del estado de carga del vehículo, como se describió anteriormente.

  4. Revisa el resultado 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