Modo Garagem

Para fornecer períodos de tempo ocioso em veículos, o Modo Garagem mantém o sistema acordado para que os trabalhos no JobScheduler restritos com ociosidade possam ser executados.

O que é o Modo Garagem?

Em dispositivos conectados, como telefones, os usuários confiam no sistema para garantir que os dispositivos sejam estáveis, atualizados e otimizados. Para atingir esse estado, a plataforma Android fornece uma janela de tempo ocioso durante a qual os aplicativos podem realizar tarefas quando o usuário não interage com o dispositivo. Um telefone é 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 telefone, quando um carro não está sendo usado, ele é desligado, o que significa que o carro não tem janela de tempo ocioso . O Modo Garagem garante tempo ocioso em um carro.

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

Diretrizes de implementação do dispositivo

Para ativar o Modo Garagem, ao desligar o veículo, o Veículo HAL (VHAL) deve 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 efetivo, o VHAL deve 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 Garagem, que detecta trabalhos agendados no JobScheduler e impede que o sistema prossiga para suspender ou desligar até que os trabalhos sejam concluídos.

Como as implementações de dispositivos se conectam à estrutura do Android?

Para o Modo Garagem, a estrutura solicita ao VHAL que estenda o tempo de desligamento até que a duração necessária seja excedida ou todos os trabalhos tenham sido executados, momento em que o sistema será desligado. Sob circunstâncias específicas definidas no CDD, as implementações de dispositivos podem desligar o sistema mais cedo. (Para obter detalhes sobre os requisitos de compatibilidade do Android, consulte o Documento de definição de compatibilidade do Android (CDD) .) Se o VHAL precisar desligar o sistema antes da conclusão do Modo Garagem, o VHAL poderá emitir SHUTDOWN_PREPARE com o parâmetro definido como SHUTDOWN_IMMEDIATELY ou SLEEP_IMMEDIATELY . As implementações de dispositivos podem usar isso apenas em circunstâncias específicas, normalmente quando os recursos necessários para manter o sistema em execução não estão disponíveis. Por exemplo, quando a capacidade da bateria é insuficiente.

Modo garagem

Como os desenvolvedores de aplicativos trabalham com o Modo Garagem?

Aplicativos e serviços não interagem diretamente com o Modo Garagem. Em vez disso, os aplicativos agendam trabalhos no JobScheduler . Esses trabalhos restringidos pela ociosidade são executados durante o Modo Garagem.

O código a seguir mostra como agendar um trabalho para ser executado 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());

Depurando o Modo Garagem

Para depurar o Modo Garagem:
  1. Para habilitar 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 revisar a saída do logcat para indicar que o Modo Garagem 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 a saída do logcat para indicar 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. Revise 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