Identificar bloqueios de ativação criados por outras APIs

Várias bibliotecas e APIs do sistema podem adquirir wake locks que são atribuídos ao app. Isso pode dificultar a identificação de um wake lock no app que possa estar causando um problema. Se você usar uma API incorretamente, isso poderá fazer com que o app mantenha uma trava de ativação por muito tempo, mesmo que você não esteja chamando as APIs de trava de ativação diretamente.

Este documento lista alguns nomes comuns de bloqueio de ativação que podem aparecer ao usar as ferramentas de depuração de bloqueio de ativação. Você também pode encontrar esses nomes em um relatório do Android vitals. Em alguns casos, o bloqueio de ativação pode ter sido criado por uma biblioteca ou API do sistema. Em outros casos, há um motivo para a ferramenta estar ofuscando o nome do wake lock usado no app. Você pode usar as ferramentas de depuração para identificar wake locks com comportamento incorreto e, em seguida, procurar o nome do wake lock neste documento para identificar qual API pode estar causando o problema e como solucioná-lo.

Este documento aborda os seguintes nomes de bloqueio de ativação. Em cada caso, embora a trava de ativação possa ser criada por outra biblioteca ou API, ela é atribuída ao app que chamou essa API.

*alarm*

Esse wake lock é adquirido por AlarmManager e atribuído ao app que faz a chamada. AlarmManager adquire o wake lock quando o alarme é acionado e libera o bloqueio quando o método onReceive() da transmissão de alarme termina a execução.

Recomendação

Recomendamos as práticas a seguir para otimizar o comportamento do alarme:

  • Use AlarmManager para otimizar a frequência de programação de alarmes.
  • Use alarmes RTC_WAKEUP (que ativam o dispositivo) apenas quando necessário.
  • Minimize o uso de alarmes e evite trabalhos demorados no método onReceive().

AudioIn, AudioMix etc.

Vários wake locks com nomes que começam com Audio são adquiridos por APIs de mídia ao gravar ou reproduzir áudio. Os bloqueios de ativação são atribuídos ao app de chamada.

O AudioIn é adquirido durante a captura de AudioRecord no modo de câmera, enquanto o microfone está ativo. O AudioMix é adquirido durante a reprodução AudioTrack no dispositivo. Outras APIs de mídia podem adquirir bloqueios de ativação com outros nomes que começam com Audio.

Recomendação

Recomendamos as seguintes práticas:

  • Não use nomes de wake lock que começam com Audio.
  • Se você estiver usando as APIs de mídia, não será necessário adquirir bloqueios de ativação diretamente. Você pode confiar nas APIs para adquirir os bloqueios de ativação necessários para você.
  • Ao usar APIs de mídia, encerre a sessão de mídia quando não precisar mais dela.

GOOGLE_C2DM

Esse wake lock é adquirido pelo GCM ao transmitir uma transmissão do Firebase Cloud Messaging (FCM) para o app. O wake lock é liberado quando o método de transmissão onMessageReceived() do FCM termina a execução.

Recomendação

Recomendamos as seguintes práticas para otimizar o comportamento do FCM:

  • Otimize a frequência de entrega do FCM.
  • Não use o FCM de alta prioridade, a menos que a mensagem precise ser enviada imediatamente.
  • Conclua o método onMessageReceived() o mais rápido possível. Consulte as orientações do Firebase para mais informações.

*job*/<package_name>/<package_and_job_name>

Esses wake locks são usados por trabalhos do JobScheduler ao executar tarefas em segundo plano. Os bloqueios de ativação são atribuídos ao app que criou os workers.

"<package_name>" é o nome do pacote do app, não o texto literal <package name>. Da mesma forma, "<package_and_job_name>" é o nome do pacote seguido pelo nome do job. *job* é a sequência de caracteres *job*, com asteriscos. Os asteriscos não estão sendo usados como curinga. Confira um exemplo de nome de wake lock:

*job*/com.example.app/com.example.app.example.path.ExampleJobService

Recomendação

Audite o uso das tarefas do JobScheduler. Siga nossas orientações para otimizar o uso da bateria para APIs de programação de tarefas.

*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService

Esses wake locks são usados por workers do WorkManager ao executar tarefas em segundo plano. Os bloqueios de ativação são atribuídos ao app que criou os workers.

"<package_name>" é o nome do pacote do app, não o texto literal <package name>. *job* é a sequência de caracteres *job*, com asteriscos. Os asteriscos não estão sendo usados como curinga.

Recomendação

Audite o uso de workers do WorkManager. Siga nossas orientações para otimizar o uso da bateria para APIs de programação de tarefas.

NetworkLocationLocator, FusedLocation, *location*

Esses nomes de bloqueio de ativação são usados por LocationManager e FusedLocationProviderClient para adquirir e fornecer a localização do dispositivo. Os bloqueios de ativação são atribuídos ao app que chamou essas APIs.

Recomendação

Otimize o uso da localização. Por exemplo, defina timeouts, solicite a localização em lote ou use atualizações de localização passivas.

_UNKNOWN

Se as ferramentas de depuração acharem que um nome de wake lock contém informações de identificação pessoal (PII), elas não vão mostrar o nome real do wake lock. Em vez disso, ele rotula o bloqueio de desbloqueio como _UNKNOWN. Por exemplo, as ferramentas podem fazer isso se o nome da trava de ativação tiver um endereço de e-mail.

Recomendação

Siga as práticas recomendadas de nomenclatura de wake lock e evite usar PII no nome do wake lock. Se você encontrar uma trava de ativação chamada _UNKNOWN atribuída ao seu app, tente identificar qual trava de ativação é essa e dê um nome diferente a ela.