Como posso saber se estou afetado?
Esta é provavelmente a primeira pergunta para aqueles que não estão familiarizados com este tópico. Com o Gingerbread (Android 2.3) e superior, você tem um serviço a bordo para ajudá-lo a descobrir: estatísticas da bateria. Embora os fabricantes tendam a colocá-lo em pontos diferentes, ele é encontrado principalmente em Configurações → Sobre o telefone → Bateria ou similar e mostra uma lista dos aplicativos que utilizaram a maior parte da bateria. Além disso, há um pequeno gráfico. Toque nesse botão e ele o levará a uma tela semelhante a esta:
Captura de tela das estatísticas da bateria no Android 2.3
Escolhi uma captura de tela de um dos meus dispositivos que ilustra o problema. Observando as duas barras azuis inferiores ("Aktiv" = O dispositivo foi mantido acordado (ativo), "Bildschirm an" = "Tela ativada"), a barra azul mais à direita no "Aktiv" indica um WakeLock: O dispositivo foi mantido ocupado apesar de o fato de a tela estar desligada. Assim, podemos ter certeza de que temos um WakeLock - mas não podemos dizer quem o causou.
Se o seu dispositivo não oferece esta tela (ou as barras na parte inferior: Acabei de descobrir, por exemplo, o LG Optimus 4X executando o Android 4.0.3 cortou essas barras), você pode encontrá-las, por exemplo, usando o GSam Battery Monitor :
Informações semelhantes do GSam Battery Monitor - aqui as "barras azuis" mencionadas são amarelas / laranja
O que causou o WakeLock?
Infelizmente, esta pergunta não pode ser respondida usando aplicativos pré-instalados (exceto, talvez, algumas ROMs personalizadas). Mas existem ferramentas disponíveis que podem. O candidato mais conhecido para isso é BetterBatteryStats e mostra a causa em sua seção parcial de wakelocks :
Imagens de BetterBatteryStats
No primeiro exemplo 2 (retirado da página playstore do aplicativo), o evento que causou a maioria dos WakeLocks foi o desejado: não queremos que a reprodução seja interrompida enquanto ouve música. Portanto, o segundo exemplo 3 (retirado de um caso real em um dos meus dispositivos) pode ser melhor: os três eventos mais importantes são causados pelo mesmo aplicativo, que precisava do WakeLock para manter o serviço de envio IMAP ativo.
Para uma alternativa ao BetterBatteryStats , confira o aplicativo Wakelock Detector mencionado na resposta do UzumApps - que parece mais fácil de lidar, especialmente para os não técnicos:
Detector Wakelock - Clique na imagem para ampliar. (Fonte: Google Play )
O que pode ser feito?
Se o caso for tão claro quanto no segundo exemplo da seção anterior, a ação será bastante óbvia - pelo menos no meu caso: não preciso ser informado imediatamente quando um e-mail chegar; um atraso de 30 minutos é absolutamente aceitável. Então, entrei no aplicativo de email, desabilitei o IMAP Push (consulte também: Push Email ) e alternei para um intervalo de pesquisa de 30 minutos. O WakeLocks não desapareceu completamente, mas caiu notavelmente - a duração da bateria melhorou notavelmente.
Depois, há o caso mencionado na pergunta em si: um aplicativo com mau comportamento que não libera seu WakeLock. Confronte o desenvolvedor com suas descobertas e peça uma solução. Se ele entregar: problema resolvido. Caso contrário: quase sempre há um aplicativo alternativo disponível.
E se for o próprio sistema Android?
Sim, às vezes parece exatamente isso: 98% ou mais consumido por algum serviço Android. Ah, se for 98%, na maioria dos casos o candidato se chama LocationManagerService . Cara mau nos espionando? Não necessariamente. Nesse caso especial, o "bandido" listado nem é culpado - pelo menos não diretamente. Aqui está outro aplicativo que solicita a localização atual com muita frequência. Há um excelente artigo no Setera.org sobre o assunto: Identificando o local da bateria do Android LocationManagerService . Para dar um resumo: ele usa o Androiddumpsys
recurso (requer raiz!) para despejar um estado do sistema e permite investigar os ouvintes estabelecidos para o LocationManagerService. Um olhar mais atento às suas configurações mostra que elas são constantemente "marteladas" para obter informações de localização (algumas o fazem permanentemente, ou seja, sem interrupção). Como o ID do aplicativo é listado junto e em outro local do despejo, mesmo junto com o nome técnico do aplicativo, você ainda pode identificá-lo e executar as ações apropriadas.
E quanto aos OVNIs?
Infelizmente, existem: Aplicativos que registraram um WakeLock - e saíram sem liberá-lo. O que resta são * Obsoletos não utilizados * - WakeLocks mantidos sem uso. Portanto, não há como simplesmente colocar o aplicativo em primeiro plano e reconfigurá-lo ou fazê-lo liberar seus WakeLocks.
Aqui, a única solução conhecida para mim é uma reinicialização - e eu gostaria de ter uma solução melhor. Obviamente, se você conhece o aplicativo culpado, as etapas a respeito são as mesmas que acima: informe o desenvolvedor, obtenha uma correção - ou substitua o aplicativo. Mas sobre como se livrar do WakeLock atual ? Talvez alguém possa fornecer uma alternativa melhor para a reinicialização?
Existem algumas leituras adicionais recomendadas?
Certo. Um por enquanto, posso acrescentar mais tarde:
/sys/power/wake_lock
, mas que se fizesse da maneira "certa" usando o PowerManager e o PowerManager.WakeLock, o serviço manteria o wakelock real e liberá-lo mesmo que o seu processo foi morto ...