Novedades de productos
Optimizar la batería de una aplicación con la métrica de wake locks de Android vitals
Lectura de 7 minutos
La duración de la batería es un aspecto crucial de la experiencia de usuario, y los bloqueos de activación tienen un papel fundamental. ¿Los usas en exceso? En esta entrada de blog, veremos qué son los wake locks, cuáles son algunas de las prácticas recomendadas para usarlos y cómo puedes entender mejor el comportamiento de tu aplicación con la métrica de Play Console.
Uso excesivo de wake locks parciales en Android vitals
Play Console ahora monitoriza el consumo de batería, centrándose en el uso excesivo de wake locks parciales como indicador clave de rendimiento.
Esta función aumenta la importancia de la eficiencia de la batería junto con los indicadores de estabilidad de las métricas principales: los fallos y errores ANR excesivos percibidos por los usuarios. Hemos definido un umbral de mal funcionamiento para los wake locks excesivos. A partir del 1 de marzo del 2026, si tu título no cumple este umbral de calidad, es posible que lo excluyamos de las superficies de descubrimiento destacadas, como las recomendaciones. En algunos casos, podemos mostrar una advertencia en tu ficha de Play Store para indicar a los usuarios que tu aplicación puede provocar un consumo excesivo de batería.
La advertencia de wake lock excesivo en la información general de Android vitals
En el caso de los dispositivos móviles, la métrica de Android vitals se aplica a los wake locks no exentos adquiridos mientras la pantalla está apagada y la aplicación se está ejecutando en segundo plano o está ejecutando un servicio en primer plano. Android vitals considera que el uso de wake locks parciales es excesivo si se cumplen las siguientes condiciones:
- Los bloqueos de activación se mantienen durante al menos dos horas en un periodo de 24 horas.
- Afecta a más del 5% de las sesiones de tu aplicación, de media, durante 28 días.
Los wake locks creados por las APIs iniciadas por el usuario audio, location y JobScheduler no se incluyen en el cálculo de los wake locks.
Información sobre los wake locks
Un wake lock es un mecanismo que permite que la CPU de un dispositivo siga funcionando aunque el usuario no esté interactuando activamente con él.
Los wake locks parciales mantienen la CPU en funcionamiento aunque la pantalla esté apagada, lo que impide que la CPU entre en un estado de suspensión de bajo consumo. Un wake lock completo mantiene la pantalla y la CPU en funcionamiento.
Hay dos métodos para adquirir wake locks parciales:
- La aplicación adquiere y libera manualmente el wake lock mediante las APIs de PowerManager para un caso práctico específico. A menudo, se adquiere junto con un servicio en primer plano, una API del ciclo de vida de la plataforma diseñada para operaciones perceptibles por el usuario.
- También puede ocurrir que otra API adquiera el wake lock y se atribuya a la aplicación debido al uso de la API. Encontrarás más información sobre esto en la sección de prácticas recomendadas.
Aunque los bloqueos de activación son necesarios para tareas como completar la descarga de un archivo grande iniciada por el usuario, su uso excesivo o inadecuado puede provocar un consumo significativo de la batería. Hemos visto casos en los que las aplicaciones mantienen los bloqueos de activación durante horas o no los liberan correctamente, lo que provoca que los usuarios se quejen de un consumo de batería significativo incluso cuando no están interactuando con la aplicación.
Prácticas recomendadas para usar Wake Lock
Antes de explicar cómo depurar el uso excesivo de los bloqueos de activación, asegúrate de seguir las prácticas recomendadas para los bloqueos de activación.
Plantéate estas cuatro preguntas fundamentales.
1. ¿Has pensado en otras opciones de wake lock?
Antes de plantearte adquirir un bloqueo de activación parcial manual, sigue este diagrama de flujo para tomar la decisión:
Diagrama de flujo para decidir cuándo adquirir manualmente un wake lock
- ¿La pantalla tiene que permanecer encendida?
- Sí: consulta la documentación sobre Mantener pantalla activa.
- ¿La aplicación está ejecutando un servicio en primer plano?
- No: no es necesario que adquieras manualmente un bloqueo de activación.
- ¿Afecta negativamente a la experiencia del usuario si el dispositivo se suspende?
- No: por ejemplo, actualizar una notificación después de que el dispositivo se active no requiere un wake lock.
- Sí: si es fundamental evitar que el dispositivo se suspenda, como en el caso de una comunicación continua con un dispositivo externo, continúa.
- ¿Ya hay una API que mantenga el dispositivo activo en tu nombre?
- Puedes consultar la documentación Identificar los bloqueos de activación creados por otras APIs para identificar situaciones en las que otras APIs, como LocationManager, crean bloqueos de activación.
- Si no hay APIs, ve a la última pregunta.
- Si has respondido a todas estas preguntas y has determinado que no hay ninguna alternativa, debes adquirir manualmente un wake lock.
2. ¿Estás asignando el nombre correcto al wake lock?
Cuando adquieras manualmente los bloqueos de activación, es importante que les pongas nombres adecuados para depurar:
- No incluyas información de identificación personal (IIP) en el nombre, como direcciones de correo electrónico. Si se detecta IIP, el wake lock se registra como
_UNKNOWN, lo que dificulta la depuración. - No asignes nombres a tus wake lock de forma programática mediante nombres de clases o métodos, ya que herramientas como Proguard pueden ofuscarlos. En su lugar, usa una cadena codificada.
- No añadas contadores ni identificadores únicos a las etiquetas de wake lock. La misma etiqueta debe usarse cada vez que se ejecute el wake lock para permitir que el sistema agregue el uso por nombre, lo que facilita la detección de comportamientos anómalos.
3. ¿Se libera siempre el bloqueo de activación adquirido?
Si adquieres un wake lock manualmente, asegúrate de que la liberación del wake lock siempre se ejecute. Si no liberas un wake lock, la batería puede descargarse considerablemente.
Por ejemplo, si se produce una excepción no controlada durante processingWork(), es posible que nunca se realice la llamada release(). En su lugar, puedes usar un bloque try-finally para garantizar que se libera el wake lock, aunque se produzca una excepción.
Además, puedes añadir un tiempo de espera al wake lock para asegurarte de que se libera después de un periodo específico, lo que evita que se mantenga indefinidamente.
fun processingWork() {
wakeLock.apply {
try {
acquire(60 * 10 * 1000) // timeout after 10 minutes
doTheWork()
} finally {
release()
}
}
}4. ¿Puedes reducir la frecuencia de las activaciones?
En el caso de las solicitudes de datos periódicas, reducir la frecuencia con la que tu aplicación activa el dispositivo es fundamental para la optimización de batería. Estos son algunos ejemplos de cómo reducir la frecuencia de activación:
- WorkManager: aumenta el intervalo periódico en PeriodicWorkRequests.
- SensorManager: aprovecha el procesamiento por lotes especificando maxReportLatencyMs al registrar el receptor.
- Proveedor de ubicaciones combinadas:
- Reduce la frecuencia de obtención de la ubicación usando getLastLocation para obtener la ubicación más reciente almacenada en caché.
- Usa setPriority(PRIORITY_PASSIVE) para usar un método de actualización que consuma menos batería.
- También puedes aprovechar el mecanismo de procesamiento por lotes de la ubicación definiendo un intervalo de actualización mínimo con setMinUpdateIntervalMillis.
Puede consultar más detalles en la documentación sobre las prácticas recomendadas de wake lock.
Depurar el uso excesivo de wake locks
Incluso con las mejores intenciones, se puede producir un uso excesivo de los wake lock. Si tu aplicación se ha marcado en Play Console, sigue estos pasos para depurarla:
Identificación inicial con Play Console
El panel de control de wake locks parciales excesivos de Android vitals ofrece desgloses de los nombres de wake locks no exentos asociados a tu aplicación, mostrando las sesiones y las duraciones afectadas. Te recordamos que consultes la documentación para saber si el nombre del wake lock lo tiene la aplicación o lo tiene otra API.
En el panel de control de wake locks parciales excesivos de Android vitals, se ha desplazado hacia abajo hasta la sección de desgloses para ver las etiquetas de wake locks excesivos.
Depurar los bloqueos de activación excesivos que mantienen los workers o los trabajos
Puedes identificar los wake locks mantenidos por el trabajador con este nombre de wake lock:
*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
Puedes consultar la lista completa de variaciones de nombres de wake lock mantenidos por el trabajador en la documentación. Para depurar estos bloqueos de activación, puedes usar el inspector de tareas en segundo plano para depurar localmente o aprovechar getStopReason para depurar problemas en el campo.
Inspector de tareas en segundo plano de Android Studio
Captura de pantalla del inspector de tareas en segundo plano, donde se ha podido identificar un trabajador "WeatherSyncWorker" que ha reintentado y fallado con frecuencia.
Para depurar localmente problemas de WorkManager, usa esta herramienta en un emulador o un dispositivo conectado (nivel de API 26 o superior). Muestra una lista de los elementos de trabajo y sus estados (finalizado, en ejecución o en cola), lo que te permite inspeccionar los detalles y comprender las cadenas de elementos de trabajo.
Por ejemplo, puede revelar si un trabajador falla o vuelve a intentarlo con frecuencia debido a las limitaciones del sistema.
Consulta más información en la documentación del inspector de tareas en segundo plano.
WorkManager getStopReason
Para depurar en el campo los workers con bloqueos de activación excesivos, usa WorkInfo.getStopReason() en WorkManager 2.9.0 o versiones posteriores, o bien JobParameters.getStopReason() en JobScheduler, disponible en SDK 31 o versiones posteriores.
Esta API ayuda a registrar el motivo por el que se ha detenido un trabajador (por ejemplo, STOP_REASON_TIMEOUT o STOP_REASON_QUOTA), lo que permite identificar problemas como los tiempos de espera frecuentes debido al agotamiento de la duración del tiempo de ejecución.
backgroundScope.launch {
WorkManager.getInstance(context)
.getWorkInfoByIdFlow(workRequest.id)
.collect { workInfo ->
logStopReason(workRequest.id, workInfo?.stopReason)
}
}Consulta más información sobre cómo optimizar el uso de la batería para las APIs de programación de tareas.
Depurar otros tipos de wake locks excesivos
En los casos más complejos en los que se mantienen manualmente los wake locks o las APIs que mantienen el wake lock, te recomendamos que uses la recogida de rastreo del sistema para depurar.
Recogida de trazas del sistema
Un trazado del sistema es una potente herramienta de depuración que registra de forma detallada la actividad del sistema durante un periodo. Proporciona información valiosa sobre el estado de la CPU, la actividad de los hilos, la actividad de la red y las métricas relacionadas con la batería, como la duración de las tareas y el uso de los wake locks.
Puedes registrar un rastreo del sistema de varias formas:
- Utilizar la herramienta de línea de comandos system trace
- Usar el Perfilador de CPU de Android Studio
- Usar la interfaz de usuario de Perfetto
- Registrar un rastreo manualmente en el dispositivo directamente desde las opciones para desarrolladores.
Habilita la categoría "power:PowerManagement" de Atrace en la interfaz de usuario de Perfetto, en la pestaña Aplicaciones y servicios de Android.
Independientemente del método elegido, es fundamental que recoja la categoría "power:PowerManagement" de Atrace para poder ver las pistas de estado del dispositivo.
Inspección de la interfaz de usuario de Perfetto y análisis de SQL
Las trazas del sistema se pueden abrir e inspeccionar en la interfaz de usuario de Perfetto. Cuando abras el registro, verás una visualización de varios procesos en una cronología. En esta guía, nos centraremos en las pistas de "Estado del dispositivo".
Fija las pistas de "Estado del dispositivo", como "Aplicación principal", "Estado de la pantalla", "Bloqueos de activación prolongados" y "Tareas", para identificar visualmente los segmentos de wake lock de larga duración.
En cada bloque se indica el nombre del evento, cuándo empezó y cuándo terminó. En Perfetto, se denomina "slice".
Para analizar varias trazas de forma escalable, puedes usar el análisis SQL de Perfetto. Una consulta de SQL puede encontrar todos los bloqueos de activación ordenados por duración, lo que ayuda a identificar los principales factores que contribuyen a un uso excesivo.
Aquí tienes un ejemplo de consulta que suma todas las etiquetas de wake lock que se han producido en el trazado del sistema, ordenadas por duración total:
SELECT slice.name as name, track.name as track_name,SUM(dur / 100000) as total_dur_ms FROM slice JOIN track ON slice.track_id = track.id WHERE track.name = 'WakeLocks'GROUP BY slice.name, track.name ORDER BY total_dur_ms DESC
Usar ProfilingManager para recoger trazas en el campo
En el caso de los problemas difíciles de reproducir, ProfilingManager (añadido en el SDK 35) es una API programática que permite a los desarrolladores recoger rastreos del sistema en el campo con activadores de inicio y fin. Ofrece más control sobre los puntos de activación de inicio y fin de la recogida de perfiles, y aplica el límite de uso a nivel del sistema para evitar que afecte al rendimiento del dispositivo.
Consulta la documentación de ProfilingManager para ver los pasos que debes seguir para implementar la recogida de rastreos del sistema en el campo, como capturar un rastreo, analizar datos de perfil y usar comandos de depuración locales de forma programática.
Los rastreos del sistema recogidos con ProfilingManager serán similares a los recogidos manualmente, pero los procesos del sistema y otros procesos de la aplicación se ocultarán en el rastreo.
Conclusión
La métrica de wake locks parciales excesivos de Android vitals es solo una pequeña parte de nuestro compromiso continuo de ayudar a los desarrolladores a reducir el consumo de batería y mejorar la calidad de las aplicaciones.
Si entiendes e implementas correctamente los bloqueos de activación, puedes optimizar significativamente el rendimiento de la batería de tu aplicación. Aprovechar las APIs alternativas, seguir las prácticas recomendadas de wake lock y usar potentes herramientas de depuración, como el inspector de tareas en segundo plano, los rastreos del sistema y ProfilingManager, es fundamental para que tu aplicación tenga éxito en Google Play.
Seguir leyendo
-
Noticias sobre productos
Nos complace anunciar importantes actualizaciones de nuestros recursos de diseño, que te ofrecen la guía completa que necesitas para crear aplicaciones Android adaptables y de alta calidad en todos los factores de forma. Ahora tenemos una guía sobre la experiencia de escritorio y una galería de diseño de Android renovada.
Ivy Knight • Tiempo de lectura: 2 min
-
Noticias sobre productos
Se ha lanzado la primera versión alfa de Room 3.0. Room 3.0 es una versión principal de la biblioteca que introduce cambios importantes y se centra en Kotlin Multiplatform (KMP). Además, añade compatibilidad con JavaScript y WebAssembly (WASM) a la compatibilidad con Android, iOS y JVM para ordenadores.
Daniel Santiago Rivera • Tiempo de lectura: 4 min
-
Noticias sobre productos
Hoy nos complace compartir cómo estamos incorporando la optimización automática dirigida por comentarios (AutoFDO) al kernel de Android para ofrecer a los usuarios mejoras significativas en el rendimiento.
Yabin Cui • Tiempo de lectura: 4 min
Mantente al día
Recibe cada semana en tu bandeja de entrada las últimas novedades sobre el desarrollo para Android.