Wakelock

From FdIwiki ELP
Jump to: navigation, search

Introducción

¿Qué es un Wakelock?

Un Wakelock es un proceso que se ejecuta en segundo plano y que fuerza a la CPU a estar activa. Por lo tanto un Wakelock fuerza al dispositivo a mantenerse despierto aún cuando no lo estemos utilizando.

Un Wakelock no se debe confundir con los procesos de sincronización de cuentas que tengamos almacenados en nuestro Smartphone(por ejemplo, la sincronización de correos de Gmail para que cuando nos llegue un nuevo correo se notifique inmediatamente en el dispositivo). Estos procesos de sincronización si que pueden tener asociados Wakelocks.

Tipos

  • Parciales: mantienen la CPU activa, pero no la pantalla.
  • Totales: mantienen la CPU activa, además de la pantalla.

Motivación

Los procesadores actuales disponen de distintos modos de gasto de energía:

  • Modo idle: se usa cuando el procesador se encuentra totalmente inactivo, por lo que no se permite la ejecución de instrucciones.
  • Modo bajo consumo: el procesador tiene una frecuencia y voltaje bajos.
  • Modo alto rendimiento: el procesador tiene una frecuencia y voltaje altos.

Si por ejemplo suspendemos un ordenador, el kernel entra en el suspensión, en el cual se apagan las CPU y por consiguiente las aplicaciones que se encontraban en funcionamiento se interrumpen. Al suspender el ordenador también se apagan la pantalla y los discos del dispositivo, pero la RAM permanece activa.

Dado el carácter multimedia y el uso elevado de aplicaciones en segundo plano que tienen que mantenerse activas en los Smartphones (por ejemplo reproductor de música, Whatsapp, llamadas telefónicas...), el usuario no quiere que al bloquear la pantalla deje de ejecutarse aplicaciones que tenga ejecutando en segundo plano, por lo que estos dispositivos no deben entrar en el modo suspensión de la misma manera en la que lo hacen los ordenadores convencionales.

Por lo cual, se decidió implementar un mecanismo para Android llamado Wakelock, el cual permite a las aplicaciones, drivers y otros elementos indicar al sistema cuándo quieren que el sistema se mantenga activo para que las aplicaciones puedan seguirse ejecutando en un segundo plano.

Para ahorrar batería, los dispositivos Android se duermen rápidamente tras un corto periodo de inactividad del usuario. Por lo tanto, los Wakelocks pueden ser usados para mantener cierto Hardware activo: pantalla, CPU… durante un determinado tiempo.

Usos en aplicaciones

Los Wakelocks se utilizan en las aplicaciones Android para mantener cierto hardware encendido durante un tiempo determinado.

Ejecución de secciones críticas

Utilizamos Wakelocks para que al ejecutar una cierta sección crítica de código, el dispositivo no se apague.

WakelockIncorrectoPrevio.png

Usos incorrectos

En esta sección detallamos los casos en los que se utilizan incorrectamente los Wakelocks, lo cual puede causar un gasto extra de energía o lo que es aún peor, un app crash.

Adquisición temprana/liberación tardía

En este caso se adquiere el Wakelock demasiado temprano o se libera demasiado tarde, teniéndolo así más tiempo del necesario, lo que ocasiona un gasto de energía al dispositivo.

WakelockMalAdquiridoLiberado.png

Nunca se libera

En este otro caso el Wakelock se adquiere pero nunca se libera, por lo que el dispositivo nunca puede entrar en estado de suspensión y ocasiona un gran gasto de energía.

WakelockNuncaLiberado.png

Liberación antes de adquisición

En este caso el Wakelock se libera antes de haberlo adquirido por lo que esto causa un crash app.

WakelockAppCrash.png

Apps que utilizan Wakelocks

Skype t.png
  • Skype tenía un Wakelock que dejaba funcionando los procesos de la cámara.
  • Aunque la cámara no estuviera funcionando, consumía batería como si lo estuviese.








YoutubeLogo.png
  • YouTube mantiene la pantalla sin que la tengamos que tocar mientras estamos reproduciendo un vídeo.
  • Se considera un Wakelock "benigno".






GoogleMapsLogo.png
  • Google Maps mantiene la pantalla la pantalla activa mientras navegamos.
  • Adquiere el Wakelock cuando el usuario empieza a navegar.
  • Libera el Wakelock cuando el usuario deja de navegar o ha alcanzado su destino.







Wakelocks en el kernel

Aqui mostramos cómo están definidos en el kernel los Wakelocks, así como las funciones disponibles:





centr centr centr

Uso de wakelocks

En espacio de usuario

Un proceso puede adquirir un wakelock escribiendo el nombre en el directorio:

- /sys/power/wake_lock

Un proceso puede liberar un wakelock en el directorio:

- /sys/power/wake_unlock

En aplicaciones Java

centr

Controversias

La implantación de Wakelocks generó ciertas controversias entre los desarrolladores de Android y la comunidad del kernel de Linux. La controversia surgió a partir de un parche de Android a la rama principal del kernel de Linux en el cual se implementaban los wakelocks, lo cual fue rechazado por diversas razones:

  • Había mucho código duplicado de la existente API pm_qos (explicar que es y buscar relación con los wakelocks). Parece ser que la API pm_qos no cumplía con las necesidades de Android.
  • Android deshabilitaba la interfaz existente /sys/power/state, la cual no se lleva/no funciona muy bien con los wakelocks.
  • No hay manera de recuperarse si un proceso del espacio de usuario termina y este tiene un wakelock.
  • El código de Android fue desarrollado a puerta cerrada, esto implica no seguir el proceso de desarrollo establecido para el kernel de Linux. En particular, no siguieron las siguientes reglas de desarrollo del kernel:

- “Post early and often” (Post temprano y a menudo): al desarrollar en código cerrado no recibían feedback de la comunidad de desarrollo.

- Upstream first: primero se comercializó antes de subir el código a la rama principal, lo que puede provocar que tenga varios problemas, APIs insostenibles etc...

- Desarrollo para todos: los desarrolladores del kernel trabajan con el objetivo de mejorar el kernel para todos. En cambio los desarrolladores de sistemas empotrados generalmente están interesados en resolver un problema específico y con limitaciones de tiempo, por lo que generan algo que es rápido, sucio y que no está sujeto a revisiones.

Referencias

AOSP Wakelock - Android

Fuentes del kernel

Controversias

Artículo controversias