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.

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