Novedades sobre productos

Optimiza la batería de tu app con la métrica de bloqueo de activación de Android vitals

Lectura de 7 min
Alice Yuan
Ingeniera de Relaciones con Desarrolladores

La duración de la batería es un aspecto fundamental de la experiencia del usuario, y los bloqueos de activación desempeñan un papel importante. ¿Los usas en exceso? En esta entrada de blog, exploraremos qué son los bloqueos de activación, cuáles son algunas prácticas recomendadas para usarlos y cómo puedes comprender mejor el comportamiento de tu propia app con la métrica de Play Console.

Uso excesivo de bloqueos de activación parciales en Android vitals

Ahora Play Console supervisa el agotamiento de la batería y se enfoca en el uso excesivo de bloqueos de activación 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 esenciales existentes: fallas y errores de ANR excesivos percibidos por el usuario. Definimos un umbral de comportamiento inadecuado para los bloqueos de activación excesivos. A partir del 1 de marzo de 2026, si tu título no cumple con este umbral de calidad, es posible que lo excluyamos de las plataformas de descubrimiento destacadas, como las recomendaciones. En algunos casos, es posible que mostremos una advertencia en la ficha de Play Store para indicarles a los usuarios que tu app puede agotar la batería de forma excesiva.

warning.png

La advertencia de bloqueo de activación excesivo en la descripción general de Android vitals.

En el caso de los dispositivos móviles, la métrica de Android vitals se aplica a los bloqueos de activación no exentos que se adquieren mientras la pantalla está apagada y la app está en segundo plano o ejecuta un servicio en primer plano. Android vitals considera que el uso de bloqueos de activación parciales es excesivo en los siguientes casos:

  • Los bloqueos de activación se mantienen durante al menos dos horas en un período de las 24 horas.
  • Afecta a más del 5% de las sesiones de tu app, en promedio durante 28 días.

Los bloqueos de activación creados por las APIs iniciadas por el usuario de audioubicaciónJobScheduler están exentos del cálculo de bloqueo de activación.

Información sobre los bloqueos de activación

Un bloqueo de activación es un mecanismo que permite que una app mantenga en funcionamiento la CPU de un dispositivo, incluso cuando el usuario no interactúa con él de forma activa. 

Un bloqueo de activación parcial mantiene la CPU en funcionamiento incluso si la pantalla está apagada, lo que impide que la CPU entre en un estado de "suspensión" de bajo consumo. Un bloqueo de activación completo mantiene en funcionamiento la pantalla y la CPU.

Existen 2 métodos para adquirir bloqueos parciales de activación:

  • La app adquiere y libera manualmente el bloqueo de activación con las APIs de PowerManager para un caso de uso específico. A menudo, esto se adquiere junto con un servicio en primer plano, una API de ciclo de vida de la plataforma diseñada para una operación perceptible por el usuario.
  • Como alternativa, otro API adquiere el bloqueo de activación y se atribuye a la app debido al uso de la API. Encontrarás más información sobre esto en la sección de prácticas recomendadas.

Si bien 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 agotamiento significativo de la batería. Vimos casos en los que las apps mantienen bloqueos de activación durante horas o no los liberan correctamente, lo que genera quejas de los usuarios sobre un agotamiento significativo de la batería, incluso cuando no interactúan con la app.

Prácticas recomendadas para el uso de bloqueos de activación

Antes de explicar cómo depurar el uso excesivo de bloqueos de activación, asegúrate de seguir las prácticas recomendadas para los bloqueos de activación. 

Considera estas cuatro preguntas fundamentales.


1. ¿Consideraste otras opciones de bloqueo de activación?

Antes de considerar la adquisición de un bloqueo de activación parcial manual, sigue este diagrama de flujo de toma de decisiones:

wakelock.png

Diagrama de flujo para decidir cuándo adquirir manualmente un bloqueo de activación

  1. ¿La pantalla debe permanecer encendida?
  2. ¿La aplicación ejecuta un servicio en primer plano?
    • No: No es necesario que adquieras manualmente un bloqueo de activación.
  3. ¿Es perjudicial para la experiencia del usuario que el dispositivo se suspenda?
    • No: Por ejemplo, actualizar una notificación después de que se activa el dispositivo no requiere un bloqueo de activación.
    • Sí: Si es fundamental evitar que el dispositivo se suspenda, como en el caso de la comunicación en curso con un dispositivo externo, continúa.
  4. ¿Ya existe una API que mantenga el dispositivo activo en tu nombre?
  5. Si respondiste todas estas preguntas y determinaste que no existe una alternativa, debes continuar con la adquisición manual de un bloqueo de activación.

2. ¿Le asignas el nombre correcto al bloqueo de activación?

Cuando adquieras bloqueos de activación de forma manual, es importante que los nombres sean adecuados para la depuración:

  • No incluyas información de identificación personal (PII) en el nombre, como direcciones de correo electrónico. Si se detecta PII, el bloqueo de activación se registra como _UNKNOWN, lo que dificulta la depuración.
  • No le asignes un nombre a tu bloqueo de activación de forma programática con nombres de clases o métodos, ya que herramientas como Proguard pueden ofuscarlos. En su lugar, usa una cadena hard-coded.
  • No agregues contadores ni identificadores únicos a las etiquetas de bloqueo de activación. Se debe usar la misma etiqueta cada vez que se ejecute el bloqueo de activación para permitir que el sistema agregue el uso por nombre, lo que facilita la detección de comportamientos anómalos.

3. ¿Siempre se libera el bloqueo de activación adquirido?

Si adquieres un bloqueo de activación de forma manual, asegúrate de que la liberación del bloqueo de activación siempre se ejecute. Si no se libera un bloqueo de activación, se puede agotar la batería de forma significativa. 

Por ejemplo, si se arroja una excepción no detectada durante processingWork(), es posible que nunca se realice la llamada a release(). En cambio, puedes usar un bloque try-finally para garantizar que se libere el bloqueo de activación, incluso si se produce una excepción.

Además, puedes agregar un tiempo de espera al bloqueo de activación para asegurarte de que se libere después de un período específico y evitar que se mantenga de forma indefinida.

fun processingWork() {
    wakeLock.apply {
        try {
            acquire(60 * 10 * 1000) // timeout after 10 minutes
            doTheWork()
        } finally {
            release()
        }
    }
}

4. ¿Puedes reducir la frecuencia de activación?

En el caso de las solicitudes de datos periódicas, reducir la frecuencia con la que la app activa el dispositivo es clave para la optimización de batería. Estos son algunos ejemplos para reducir la frecuencia de activación:

  • WorkManager: Aumenta el intervalo periódico en los objetos PeriodicWorkRequest.
  • SensorManager: Aprovecha el procesamiento por lotes especificando maxReportLatencyMs cuando registres el objeto de escucha.
  • Proveedor de ubicación combinada:
    • Reduce la frecuencia de recuperación de la ubicación con getLastLocation para obtener la ubicación almacenada en caché más reciente.
    • Usa setPriority(PRIORITY_PASSIVE) para un método de actualización que consuma menos batería.
    • Además, puedes aprovechar el mecanismo de procesamiento por lotes de ubicaciones estableciendo un intervalo de actualización mínimo con setMinUpdateIntervalMillis.

Puedes ver más detalles en la documentación de prácticas recomendadas sobre los bloqueos de activación.

Cómo depurar el uso excesivo de bloqueos de activación

Incluso con las mejores intenciones, se puede producir un uso excesivo del bloqueo de activación. Si tu app se marca en Play Console, sigue estos pasos para depurarla:

Identificación inicial con Play Console

El panel de Android vitals sobre bloqueos de activación parciales excesivos proporciona desgloses de los nombres de los bloqueos de activación no exentos asociados con tu app, y muestra las sesiones y duraciones afectadas. Recuerda usar la documentación para identificar si el nombre del bloqueo de activación lo mantiene la app o alguna otra API.

breakdowns2.png

El panel de Android vitals sobre el exceso de bloqueos de activación parciales se desplazó hacia abajo hasta la sección de desgloses para ver las etiquetas de exceso de bloqueo de activación.

Cómo depurar bloqueos de activación excesivos que mantienen los trabajadores o los trabajos

Puedes identificar los bloqueos de activación que mantienen los trabajadores con este nombre de bloqueo de activación:

*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService

La lista completa de variaciones de los nombres de bloqueo de activación que mantiene el trabajador está disponible en la documentación. Para depurar estos bloqueos de activación, puedes usar el Inspector de tareas en segundo plano de forma local o aprovechar getStopReason para depurar problemas en el campo. 

Inspector de tareas en segundo plano de Android Studio

taskinspector.png


Captura de pantalla del Inspector de tareas en segundo plano, en la que se pudo identificar un trabajador “WeatherSyncWorker” que reintentó y falló con frecuencia.

Para depurar de forma local los problemas de WorkManager, usa esta herramienta en un emulador o dispositivo conectado (nivel de API 26 o superior). Muestra una lista de los trabajadores y sus estados (finalizado, en ejecución, en cola), lo que te permite inspeccionar los detalles y comprender las cadenas de trabajadores. 

Por ejemplo, puede revelar si un trabajador falla o reintenta con frecuencia debido a que alcanza las limitaciones del sistema. 

Consulta la documentación del Inspector de tareas en segundo plano para obtener más detalles.

WorkManager getStopReason

Para depurar en el campo los trabajadores con bloqueos de activación excesivos, usa WorkInfo.getStopReason() en WorkManager 2.9.0 o versiones posteriores, o bien, para JobScheduler, JobParameters.getStopReason() disponible en el SDK 31 o versiones posteriores. 

Esta API ayuda a registrar el motivo por el que se detuvo un trabajador (p.ej., STOP_REASON_TIMEOUTSTOP_REASON_QUOTA) y a 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 Cómo optimizar el uso de la batería para las APIs de programación de tareas si quieres obtener más detalles.

Cómo depurar otros tipos de bloqueos de activación excesivos

Para situaciones más complejas que involucran bloqueos de activación manuales o APIs que mantienen el bloqueo de activación, te recomendamos que uses la recopilación de registros del sistema para depurar.

Registro del sistema

Un registro del sistema es una potente herramienta de depuración que captura un registro detallado de la actividad del sistema durante un período, lo que proporciona estadísticas sobre el estado de la CPU, la actividad de los subprocesos, la actividad de la red y las métricas relacionadas con la batería, como la duración del trabajo y el uso del bloqueo de activación.

Puedes capturar un registro del sistema con varios métodos: 

powermgmt.png

Habilita la categoría "power:PowerManagement" de Atrace en la IU de Perfetto en la pestaña Android apps & svcs. 

Independientemente del método elegido, es fundamental que te asegures de recopilar la categoría "power:PowerManagement" de Atrace para habilitar la visualización de los registros de estado del dispositivo. 

Inspección de la IU de Perfetto y análisis de SQL

Los registros del sistema se pueden abrir y revisar en la IU de Perfetto. Cuando abras el registro, verás una visualización de varios procesos en una línea de tiempo. En esta guía, nos enfocaremos en los registros que se encuentran en "Estado del dispositivo".

perfetto.png


Fija los segmentos en "Estado del dispositivo", como "App principal", "Estado de la pantalla", "Bloqueos de activación prolongados" y "Trabajos", para identificar visualmente los segmentos de bloqueo de activación de larga duración.

Cada bloque enumera el nombre del evento, cuándo comenzó y cuándo finalizó. En Perfetto, esto se llama segmento.

Para realizar un análisis escalable de varios registros, puedes usar el análisis de SQL de Perfetto. Una consulta en SQL puede encontrar todos los bloqueos de activación ordenados por duración, lo que ayuda a identificar los principales factores que contribuyen al uso excesivo.

Este es un ejemplo de una consulta que suma todas las etiquetas de bloqueo de activación que se produjeron en el registro 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

Usa ProfilingManager para la recopilación de registros en el campo

Para los problemas difíciles de reproducir, ProfilingManager (agregado en el SDK 35) es una API programática que permite a los desarrolladores recopilar registros del sistema en el campo con activadores de inicio y finalización. Ofrece más control sobre los puntos de activación de inicio y finalización para la recopilación de perfiles y aplica una limitación de frecuencia a nivel del sistema para evitar que se vea afectado el rendimiento del dispositivo. 

Consulta la documentación de ProfilingManager para conocer los pasos adicionales para implementar la recopilación de registros del sistema en el campo, lo que incluye cómo capturar un registro, analizar los datos de generación de perfiles y usar comandos de depuración locales de forma programática.

Los registros del sistema recopilados con ProfilingManager se verán similares a los recopilados de forma manual, pero los procesos del sistema y otros procesos de la app se ocultarán en el registro.

Conclusión

La métrica de bloqueo de activación parcial excesivo en 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 apps. 

Si comprendes y aplicas correctamente los bloqueos de activación, puedes optimizar significativamente el rendimiento de la batería de tu app. Aprovechar las APIs alternativas, cumplir con las prácticas recomendadas de bloqueo de activación y usar herramientas de depuración potentes, como Inspector de tareas en segundo plano, los registros del sistema y ProfilingManager, son claves para garantizar el éxito de tu app en Google Play.

Escrito por:

Seguir leyendo