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*
: criada porAlarmManager
.AudioIn
,AudioMix
: criados por APIs de mídia.GOOGLE_C2DM
: adquirida ao transmitir uma transmissão do Firebase Cloud Messaging (FCM) para o app.*job*/<package_name>/<package_and_job_name>
: criado por jobs do JobScheduler.*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
: criado por workers do WorkManager.NetworkLocationLocator
,FusedLocation
,*location*
: criados por APIs de localização._UNKNOWN
: mostrado por ferramentas de depuração se o nome da trava de ativação parece usar informações de identificação pessoal (PII).
*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.