¿Cómo lidiar con WakeLocks (huérfanos)?

40

Supongo que la mayoría de ustedes al menos han escuchado sobre WakeLocks . Muchos de ustedes ya los habrán experimentado , ya sea a sabiendas o no. Algunos pueden saber cómo tratar con ellos en general, pero solo unos pocos saben cómo tratar con los "candidatos más complicados".

Para aquellos que no lo saben, aunque el enlace anterior lleva a una explicación, un breve resumen: las aplicaciones pueden solicitar WAKE_LOCKque un componente del dispositivo no "duerma", para que puedan realizar una tarea incluso cuando la pantalla está apagada. Esto es muy útil en la mayoría de los casos (p. Ej., Mantener la pantalla encendida mientras se navega, mantener el WiFi activo para transmitir música), pero si se usa de manera incorrecta, hace que la batería se agote a corto plazo (hasta un 25% por hora) .

La mayoría de las veces es fácil identificar la fuente (generalmente una aplicación que se comporta mal): lo mostraré en una respuesta a continuación, ya que podría resultar útil para muchos usuarios. Pero, ¿qué hacer si la aplicación que solicitó WakeLock se cierra sin liberarla? El sistema Android no se encargará de eso . Claro, un reinicio resolvería el problema, pero no siempre es una opción (deseada).

Entonces, desde la perspectiva de los usuarios (no estoy preguntando sobre soluciones de desarrollo, sino cómo un usuario puede manejar las cosas):

¿Qué puede hacer * el usuario * para resolver el problema y evitar que se agote la batería?

Prefiero respuestas que no involucren root (para que todos los usuarios puedan beneficiarse de ello). Sin embargo, las "soluciones arraigadas" son totalmente válidas y bienvenidas también.

Izzy
fuente
2
Tenía la impresión de que esto solo era cierto si creaba el wakelock de manera "incorrecta", al usarlo /sys/power/wake_lock, pero que si lo hacía de la manera "correcta" usando PowerManager y PowerManager.WakeLock, el servicio mantendría el wakelock real y lo liberan, incluso si el proceso fue muerto ...
Izkata
1
Según la información que vinculé, obviamente ese no es el caso. Alguien informa que ha verificado las fuentes del núcleo y no ha encontrado ninguna pista al respecto. Sugerencia para los desarrolladores: parece que se pueden solicitar "wakelocks parciales" cronometrados , por lo que expirarían automáticamente cuando se agote el temporizador y no se actualice la adquisición de wakelock. Esa debe ser la "forma segura" a la que te refieres.
Izzy

Respuestas:

37

¿Cómo puedo saber que estoy afectado?

Esta es probablemente la primera pregunta para quienes no están familiarizados con este tema. Con Gingerbread (Android 2.3) y superior, tienes un servicio a bordo que te ayuda a descubrir: estadísticas de la batería. Aunque los fabricantes tienden a colocarlo en diferentes puntos, se encuentra principalmente en Configuración → Acerca del teléfono → Batería o similar, y muestra una lista de las aplicaciones que han utilizado la mayor parte de su batería. Además de eso hay un pequeño gráfico. Toca eso y te llevará a una pantalla similar a esta:

estadísticas de la batería
Captura de pantalla de estadísticas de batería en Android 2.3

Elegí una captura de pantalla de uno de mis dispositivos que ilustra el problema. Mirando las dos barras azules inferiores ("Aktiv" = El dispositivo se mantuvo despierto (activo), "Bildschirm an" = "Pantalla encendida"), la barra azul más a la derecha en "Aktiv" indica un WakeLock: El dispositivo se mantuvo ocupado a pesar de El hecho de que la pantalla estaba apagada. Entonces con esto podemos estar bastante seguros de que tenemos un WakeLock, pero no podemos decir quién lo causó.

Si su dispositivo no ofrece esta pantalla (o las barras en la parte inferior: acabo de descubrir, por ejemplo, el LG Optimus 4X que ejecuta Android 4.0.3 ha cortado estas barras), puede encontrarlas, por ejemplo, usando GSam Battery Monitor :

GSam Battery Monitor
Información similar de GSam Battery Monitor : aquí las "barras azules" mencionadas son amarillas / naranjas

¿Qué causó el WakeLock?

Desafortunadamente, esta pregunta no se puede responder usando aplicaciones preinstaladas (excepto, tal vez, algunas ROM personalizadas). Pero hay herramientas disponibles que pueden. El candidato más conocido para esto es BetterBatteryStats , y nos muestra la causa en su sección parcial de wakelocks :

BetterBatteryStats BetterBatteryStats2
Capturas de pantalla de BetterBatteryStats

En el primer ejemplo 2 (tomado de la página de la tienda de juegos de la aplicación), el evento que causó la mayoría de los WakeLocks fue el deseado: no queremos que la reproducción se detenga mientras se escucha música. Por lo tanto, el segundo ejemplo 3 (tomado de un caso real en uno de mis dispositivos) podría ser mejor: los 3 eventos más importantes son causados ​​por la misma aplicación, que necesitaba WakeLock para mantener activo el servicio de inserción IMAP.

Para obtener una alternativa a BetterBatteryStats , consulte la aplicación Wakelock Detector mencionada en la respuesta de UzumApps , que parece más fácil de manejar, especialmente para los no expertos en tecnología :

Detector Wakelock: detalles de la aplicación Detector Wakelock: Seleccionar procesos
Detector Wakelock - Haga clic en la imagen para ampliarla. (Fuente: Google Play )

¿Qué se puede hacer?

Si el caso es tan claro como en el segundo ejemplo en la sección anterior, la acción es bastante obvia, al menos en mi caso: no necesito que me informen de inmediato cuando llega un correo; Un retraso de 30 minutos es absolutamente aceptable. Así que entré en la aplicación de correo, deshabilité IMAP Push (ver también: Push Email ), y en su lugar cambié a un intervalo de sondeo de 30 minutos. WakeLocks no desapareció por completo, pero cayó notablemente: la duración de la batería mejoró notablemente.

Luego está el caso mencionado en la pregunta en sí: una aplicación de mal comportamiento que no lanza su WakeLock. Enfréntate al desarrollador con tus hallazgos y pide una solución. Si él cumple: problema resuelto. Si no: casi siempre hay una aplicación alternativa disponible.

¿Qué pasa si es el sistema Android en sí?

Sí, a veces se ve así: el 98% o más consumido por algún servicio de Android. Ah, si es 98%, en la mayoría de los casos el candidato se llama LocationManagerService . ¿Un tipo malo espiándonos? No necesariamente. En este caso especial, el "chico malo" que figura en la lista ni siquiera es culpable, al menos no directamente. Aquí hay otra aplicación que solicita la ubicación actual con demasiada frecuencia. Hay un excelente artículo en Setera.org acerca de esto: Señalar el drenaje de la batería de Android LocationManagerService . Para dar un resumen: utiliza Androiddumpsys(¡requiere root!) para volcar un estado del sistema y le permite investigar los oyentes establecidos para el LocationManagerService. Una mirada más cercana a su configuración muestra que constantemente la están "martillando" para obtener información de ubicación (algunos lo hacen permanentemente, es decir, sin interrupción). Como la identificación de la aplicación aparece en la lista, y en otro lugar del vertedero, incluso junto con el nombre técnico de la aplicación, aún puede identificarla y tomar las medidas adecuadas.

¿Y qué hay de los ovnis?

Desafortunadamente, existen: aplicaciones que registraron un WakeLock, y luego salieron sin liberarlo. Lo que queda son * Obsoletes F *** ing no utilizados * - WakeLocks retenido sin uso. Así que no hay forma de llevar la aplicación a primer plano y volver a configurarla, o hacer que lance sus WakeLocks.

Aquí la única solución que conozco es reiniciar, y me gustaría tener una mejor solución. Por supuesto, si conoce la aplicación de culpabilidad, los pasos relacionados con ella son los mismos que los anteriores: informe al desarrollador, obtenga una solución o reemplace la aplicación. ¿Pero sobre deshacerse del WakeLock actual ? ¿Quizás alguien más pueda proporcionar una mejor alternativa al reinicio?

¿Hay algunas lecturas adicionales recomendadas?

Seguro. Uno por ahora, puedo agregar más más tarde:

Izzy
fuente
2
Mejor educación para los desarrolladores para decir ... "¿Liberar wakelocks cuando hayas terminado con ellos y limpiar después de ti mismo"?
t0mm13b
3
¡Vota de mí por tu respuesta tan impresionante! Nunca te aburres de esto, ¿verdad? : D
t0mm13b
2
Claro, pero vea mi pregunta: explícitamente NO pregunto sobre el lado del desarrollador, sino desde la perspectiva de los usuarios . Tal vez necesito hacerlo más obvio;)
Izzy
1
¿Aburrido? ¿Alguien puede explicar cómo es eso? XD No, siempre tengo algo en mente. Si siento que es lo suficientemente bueno, incluso pregunto al respecto aquí (vea mi perfil: no pregunto con frecuencia), aunque podría tener una respuesta (parcial). Los comentarios aquí siempre son refrescantes si la pregunta lo vale :)
Izzy
1
¡Por favor, hazlo! ¡Y reporta tus hallazgos! Acabo de tener ese problema descrito con los WakeLocks "huérfanos". Hurgando durante una hora, no llegué más allá de ver que era el LocationManagerService . Registrado para actualizaciones, todos los 0 segundos (sic!) Fue la configuración de Android (=: - 0). Lo salí, lo detuve, lo maté en la línea de comando ... no hay forma de deshacerse de las cerraduras. ¿ Qué hizo la configuración allí? Un reinicio lo resolvió, por supuesto, pero ¿es este un WindowsPhone que tenemos que reiniciar dos veces al día?
Izzy
6

En resumen, esta es una muy buena pregunta, pero me temo que garantiza algo más que informar al usuario final.

Rediseñe el kernel para eliminar los bloqueos de activación y use una forma más exhaustiva y eficiente de administrar mejor el principio, prolongando así la vida útil de la batería.

Desafortunadamente, se ha aceptado como una solución de facto para permitir la "administración de energía" a pesar de que tampoco es exactamente eficiente. Hubo una extensa discusión sobre wakelocks (con Gregh Kroah Hartman, el gurú de Linux para el desarrollo de controladores, busco en Google el enlace exacto), otros sitios como LWN.net y otro artículo explicado en el mismo sitio aquí . Este fue el artículo al que Gregh Kroah Hartman se refirió en este blog , en el que parece estar de acuerdo con la solución alternativa propuesta por Rafael J. Wysocki que ha documentado mucho sobre la alternativa potencial. No estoy seguro de si eso está realmente en su lugar en el núcleo más moderno v3.xx

Las aplicaciones mal diseñadas pueden y a menudo solicitan wakelocks como mantener la pantalla encendida, pero de hecho, en este escenario para mantener la pantalla encendida, de hecho hay una manera más eficiente de hacer esto:

getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);

Si bien, tratando de mantener esto libre de jerga, etc. para el usuario final, realmente el núcleo del problema se reduce al código del núcleo en la forma en que se gestionan los wakelocks.

Aquí hay un breve resumen sobre XDA sobre lo que es wakelocks para los no iniciados. Al usar BetterBatteryStats , uno podría ver exactamente qué proceso está agotando la batería, el wiki está alojado en github y está disponible en el mercado aquí .

t0mm13b
fuente
1
Es curioso que señales el mismo hilo XDA que mencioné. Estoy de acuerdo con usted en que el sistema debe tener más cuidado (por ejemplo, al liberar WakeLocks solicitado por aplicaciones que ya no se ejecutan). Y que los desarrolladores deben tener más cuidado en la codificación (lanzándolos explícitamente en los estados apropiados del LifeCycle). Pero eso no nos ayuda a los usuarios a saber . Espero que mi respuesta dé una idea de lo que puede hacer un usuario, ¡y que uno de ustedes "expertos en tecnología" pueda llenar el vacío que queda!
Izzy
3

Echa un vistazo a Wakelock Detector: XDA-Developers / Google Play :

El detector Wakelock agrupa los wakelocks de la aplicación en una vista expandible para una mejor apariencia. Y muestra qué aplicaciones se están ejecutando. Y hay botones de información de desinstalación en la vista ampliada de la aplicación.

Detector Wakelock: detalles de la aplicación Detector Wakelock: Seleccionar procesos
Haga clic en la imagen para ampliar. (Fuente: Google Play )

Divulgación: Soy uno de los desarrolladores responsables de esta aplicación. Cuatro amigos más están conmigo trabajando en este proyecto como hobby.

UzumApps
fuente
¡Gracias! Esa es una información valiosa de hecho. ¿Le importaría agregar más detalles a su respuesta, por ejemplo, qué lo hace tan especial? Entonces agregaría algunas capturas de pantalla. Hasta que se haga eso: aquí está el enlace de Playstore a la aplicación ...
Izzy
¡Gracias por los detalles! Los fusioné en tu respuesta, espero que no te importe :) Pregunta de comprensión: Digamos que una aplicación consulta la ubicación usando un intervalo de "0 segundos". Esto provocaría que LocationService desactive el dispositivo. ¿ Wake Lock Detector mostrará la aplicación responsable como la causa real, o el LocationService , ya que no es parte de ese paquete de aplicaciones?
Izzy
La respuesta a su pregunta es 'no' porque el detector de wakelock agrupa los wakelocks que pertenecen al mismo nombre de paquete de la aplicación. Como Location Service pertenece a Android OS, la solución sería verificar los permisos de usuario de la aplicación
UzumApps
¡Muchas gracias! Esperaba una solución fácil para el "¿Qué pasa si es el sistema Android en sí mismo?" parte. Parece que no existe tal cosa, pero si es posible, podría ser una buena idea integrarse con WLD :)
Izzy
2
Gracias por su opinión, lo consideraré y trabajaré en eso. ¡WLD se ve bien! :)
UzumApps
1

Un par de formas que ayudarían a los usuarios de dispositivos no rooteados

  1. Al ver que @Uzumapps, uno de los desarrolladores de la aplicación ha publicado una solución usando Wakelock Detector ( WLD ), ¡me sorprende que no haya actualizado sobre el uso de la aplicación que también se puede usar sin root llamada Wakelock Detector Light ! Descubrí esto buscando una solución para mi nuevo dispositivo (sin raíz).

Este es un desarrollo reciente y, por lo tanto, lo publica para usuarios de dispositivos no rooteados. Probado como trabajando en Moto X Play (Android 6.0.1)

Nota: No pude hacer que el segundo método funcionara, agradecería la solución de edición para que funcione para personas no inteligentes como yo

Beeshyams
fuente