Modo garagem

Para fornecer períodos de inatividade em veículos, o modo Garagem mantém o sistema ativo para que os jobs em JobScheduler restritos com inatividade possam ser executados.

O que é o modo Garagem?

Em dispositivos conectados, como smartphones, os usuários dependem do sistema para garantir que os dispositivos estejam estáveis, atualizados e otimizados. Para alcançar esse estado, a plataforma Android oferece uma janela de tempo de inatividade durante a qual os apps podem realizar tarefas quando o usuário não interage com o dispositivo. Um smartphone é considerado inativo quando o usuário não o toca por um período prolongado (60 minutos ou mais) e a tela está desligada. Ao contrário de um smartphone, quando um carro não está sendo usado, ele é desligado, o que significa que ele não tem tempo de inatividade. O modo garagem garante o tempo de inatividade em um carro.

Quando um carro é desligado pelo usuário, o sistema entra no modo Garagem. Enquanto um carro está no modo Garage, o sistema é ligado, a tela é desligada e os trabalhos inativos na fila JobScheduler são executados. Para implementar o modo Garagem, consulte Diretrizes de implementação do dispositivo.

Diretrizes de implementação de dispositivos

Para ativar o modo Garagem, ao desligar o veículo, o HAL do veículo (VHAL, na sigla em inglês) precisa enviar AP_POWER_STATE_REQ com o estado SHUTDOWN_PREPARE com o parâmetro definido como SHUTDOWN_ONLY ou CAN_SLEEP.

Para que o estado SHUTDOWN_PREPARE seja eficaz, o VHAL precisa especificar os dois parâmetros (estado e o parâmetro adicional) para o comando AP_POWER_STATE_REQ. Isso permite que o dispositivo entre no modo Garage, que detecta jobs programados em JobScheduler e impede que o sistema seja suspenso ou desligado até que os jobs sejam concluídos.

Como as implementações de dispositivos se conectam ao framework do Android?

No modo Garagem, o framework solicita que o VHAL estenda o tempo de desligamento até que a duração necessária seja excedida ou todos os trabalhos sejam executados, momento em que o sistema é desligado. Em circunstâncias específicas definidas no CDD, as implementações de dispositivos podem desligar o sistema mais cedo. Para saber mais sobre os requisitos de compatibilidade do Android, consulte o Documento de definição de compatibilidade (CDD) do Android.

Se o VHAL precisar desligar o sistema antes da conclusão do modo Garagem, ele poderá emitir SHUTDOWN_PREPARE com o parâmetro definido como SHUTDOWN_IMMEDIATELY ou SLEEP_IMMEDIATELY. As implementações de dispositivos podem usar isso somente em circunstâncias específicas, normalmente quando os recursos necessários para manter o sistema em execução estão indisponíveis. Por exemplo, quando a capacidade da bateria é insuficiente.

Modo garagem

Figura 1. Fluxo do modo de garagem

Como os desenvolvedores de apps trabalham com o modo Garagem?

Os apps e serviços não interagem diretamente com o modo Garagem. Em vez disso, os apps programam jobs em JobScheduler. Os jobs restritos por inatividade são executados durante o modo Garage.

O código abaixo mostra como programar uma tarefa para ser executada durante o modo Garagem:

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 garagem de depuração

Para depurar o Modo garagem:
  1. Para ativar as categorias de registro relevantes para o modo Garagem:
    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 analisar a saída do Logcat e indicar que o modo Garagem está sendo iniciado:
    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 a saída do Logcat indica que o modo Garagem foi concluído (cancelado ou concluído):
    [GarageMode]: GarageMode was canceled
    ou
    [GarageMode]: GarageMode completed normally

    O modo Garagem depende do estado de energia do veículo, conforme descrito acima.

  4. Analise a saída do Logcat para indicar que os estados de energia corretos foram inseridos:
    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