Identifica los bloqueos de activación creados por otras APIs

Varias bibliotecas y APIs del sistema pueden adquirir bloqueos de activación atribuibles a tu app, lo que puede dificultar la identificación de un bloqueo de activación en tu app que podría estar causando un problema. Si usas una API de forma inadecuada, es posible que tu app mantenga un bloqueo de activación durante demasiado tiempo, incluso si no llamas a las APIs de bloqueo de activación directamente.

En este documento, se enumeran algunos nombres comunes de bloqueo de activación que puedes ver cuando usas las herramientas de depuración de bloqueo de activación. También es posible que veas estos nombres en un informe de Android vitals. En algunos casos, es posible que una biblioteca o una API del sistema hayan creado el bloqueo de activación. En otros casos, hay un motivo por el que la herramienta ofusca el nombre del bloqueo de activación que usas en la app. Puedes usar las herramientas de depuración para identificar los bloqueos de activación que no funcionan correctamente y, luego, buscar el nombre del bloqueo de activación en este documento para identificar qué API puede estar causando el problema y cómo resolverlo.

En este documento, se describen las situaciones en las que se pueden crear bloqueos de activación. En cada caso, si bien el bloqueo de activación puede ser creado por alguna otra biblioteca o API, el bloqueo se atribuye a la app que llamó a esa API.

AlarmManager

AlarmManager adquiere bloqueos de activación y los atribuye a la app que realiza la llamada. AlarmManager adquiere el bloqueo de activación cuando suena la alarma y lo libera cuando finaliza la ejecución del método onReceive() de la transmisión de la alarma.

Nombres de bloqueo de activación

AlarmManager crea bloqueos de activación con el nombre *alarm*. (Los asteriscos forman parte del nombre del bloqueo de activación, no representan comodines).

Recomendación

Te recomendamos que sigas estas prácticas para optimizar el comportamiento de las alarmas:

  • Usa AlarmManager para optimizar la frecuencia de programación de alarmas.
  • Solo usa alarmas de RTC_WAKEUP (que activan el dispositivo) cuando sea necesario.
  • Minimiza el uso de alarmas y evita realizar trabajos extensos en el método onReceive().

Audio y contenido multimedia

Las APIs de medios pueden adquirir bloqueos de activación cuando graban o reproducen audio. Los bloqueos de activación se atribuyen a la app que realiza la llamada.

Nombres de bloqueo de activación

Las APIs de Media adquieren bloqueos de activación con varios nombres que comienzan con Audio:

  • AudioBitPerfect: Se usa para la reproducción de audio USB sin pérdida.
  • AudioDirectOut: Se usa para la reproducción de audio sin pérdida en una TV o un dispositivo especial.
  • AudioDup: Se usa para reproducir notificaciones cuando se conecta a través de Bluetooth o USB.
  • AudioIn: Se usa para la captura de audio en el modo de cámara de video mientras el micrófono está activo.
  • AudioMix: Se usa para la reproducción de audio en un dispositivo común.
  • AudioOffload: Se usa para la reproducción a largo plazo solo de música en apps que admiten este modo.
  • AudioSpatial: Se usa para la reproducción de audio de películas o música multicanal en dispositivos que admiten audio espacial.
  • AudioUnknown: Se usa cuando no se aplican las otras situaciones.
  • MmapCapture: Se usa para la captura de audio de baja latencia.
  • MmapPlayback: Se usa para la reproducción de baja latencia, como en juegos o aplicaciones de audio profesionales.

Recomendación

Te recomendamos que sigas estas prácticas:

  • No uses nombres de bloqueo de activación que comiencen con Audio.
  • Si usas las APIs de medios, no deberías necesitar adquirir bloqueos de activación directamente; puedes confiar en las APIs para que adquieran los bloqueos de activación necesarios por ti.
  • Cuando uses APIs de medios, finaliza la sesión de medios cuando ya no la necesites.

Firebase Cloud Message (FCM)

GCM adquiere un bloqueo de activación mientras entrega una transmisión de Firebase Cloud Messaging (FCM) a la app. El bloqueo de activación se libera una vez que finaliza la ejecución del método onMessageReceived() de la transmisión de FCM.

Nombres de bloqueo de activación

GCM adquiere un bloqueo de activación con el nombre GOOGLE_C2DM.

Recomendación

Te recomendamos que sigas estas prácticas para optimizar el comportamiento de FCM:

  • Optimiza la frecuencia de entrega de FCM.
  • No uses FCM de alta prioridad, a menos que el mensaje realmente deba entregarse de inmediato.
  • Haz que el método onMessageReceived() se complete lo más rápido posible. Consulta la guía de Firebase para obtener más información.

JobScheduler

Los trabajos de JobScheduler adquieren bloqueos de activación mientras ejecutan tareas en segundo plano. Los bloqueos de activación se atribuyen a la app que creó los trabajadores.

Nombres de bloqueo de activación

Los nombres de los bloqueos de activación que adquiere JobScheduler dependen de la versión del sistema Android en la que se ejecutan y del propósito del trabajo.

Los elementos entre corchetes angulares son variables. Por ejemplo, "<package_name>" es el nombre del paquete de tu app, no el texto literal <package name>. Sin embargo, *job* es la secuencia de caracteres *job*, con asteriscos, que no se usan como comodines.

Android 15 y versiones anteriores

Los trabajos iniciados por el usuario crean bloqueos de activación con nombres que siguen este patrón:

*job*u/@<name_space>@/<package_name>/<classname>

Otros trabajos que usan este patrón:

*job*/@<name_space>@/<package_name>/<classname>
Android 16 y versiones posteriores

Los trabajos iniciados por el usuario crean bloqueos de activación con nombres que siguen este patrón:

*job*u/@<name_space>@/#<trace_tag>#/<package_name>/<classname>

Los trabajos acelerados usan este patrón:

*job*e/@<name_space>@/#<trace_tag>#/<package_name>/<classname>

Los trabajos regulares usan este patrón:

*job*r/@<name_space>@/#<trace_tag>#/<package_name>/<classname>
Ejemplo

Supongamos que hay un trabajo acelerado con el espacio de nombres backup y la etiqueta de seguimiento started. El nombre del paquete es com.example.app, y la clase que creó el trabajo es com.backup.BackupFileService.

En los dispositivos que ejecutan Android 15 o versiones anteriores, el bloqueo de activación se llamaría de la siguiente manera:

*job*/@backup@/com.example.app/com.backup.BackupFileService

En dispositivos con Android 16 o versiones posteriores, el bloqueo de activación se llamaría de la siguiente manera:

*job*e/@backup@/#started#/com.example.app/com.backup.BackupFileService

Recomendación

Audita tu uso de las tareas de JobScheduler. En particular, sigue nuestra guía para optimizar el uso de la batería en las APIs de programación de tareas.

Ubicación

LocationManager y FusedLocationProviderClient usan bloqueos de activación para adquirir y entregar la ubicación del dispositivo. Los bloqueos de activación se atribuyen a la app que llamó a esas APIs.

Nombres de bloqueo de activación

Los servicios de ubicación usan los siguientes nombres:

  • CollectionLib-SigCollector
  • NetworkLocationLocator
  • NetworkLocationScanner
  • NlpCollectorWakeLock
  • NlpWakeLock
  • *location*

Recomendación

Optimiza el uso de la ubicación. Por ejemplo, establece tiempos de espera, agrupa las solicitudes de ubicación o usa actualizaciones de ubicación pasiva.

WorkManager

Los trabajadores de WorkManager adquieren bloqueos de activación mientras ejecutan tareas en segundo plano. Los bloqueos de activación se atribuyen a la app que creó los trabajadores.

Nombres de bloqueo de activación

Los nombres de los bloqueos de activación que adquiere WorkManager dependen de la versión del sistema Android en la que se ejecutan.

Android 15 y versiones anteriores

Las tareas de WorkManager crean bloqueos de activación con nombres que siguen este patrón:

*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
Android 16 y versiones posteriores

Las tareas aceleradas crean bloqueos de activación con nombres que siguen este patrón:

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

Las tareas periódicas siguen este patrón:

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

De forma predeterminada, <trace_tag> es el nombre del trabajador.

Ejemplo

Supongamos que hay un trabajador acelerado llamado BackupFileWorker. El nombre del paquete es com.example.app.

En los dispositivos que ejecutan Android 15 o versiones anteriores, el bloqueo de activación se llamaría de la siguiente manera:

*job*/com.example.app/androidx.work.impl.background.systemjob.SystemJobService

En dispositivos con Android 16 o versiones posteriores, el bloqueo de activación se llamaría de la siguiente manera:

*job*e/#BackupFileWorker#/com.example.app/androidx.work.impl.background.systemjob.SystemJobService

Recomendación

Audita tu uso de los trabajadores de WorkManager. En particular, sigue nuestra guía para optimizar el uso de la batería en las APIs de programación de tareas.

_UNKNOWN

Si las herramientas de depuración creen que un nombre de bloqueo de activación contiene información de identificación personal (PII), no mostrarán el nombre real del bloqueo de activación. En su lugar, etiquetan el bloqueo de activación como _UNKNOWN. Por ejemplo, las herramientas podrían hacer esto si el nombre del bloqueo de activación contiene una dirección de correo electrónico.

Recomendación

Sigue las prácticas recomendadas para asignar nombres a los bloqueos de activación y evita usar PII en el nombre del bloqueo de activación. Si encuentras un bloqueo de activación llamado _UNKNOWN atribuido a tu app, intenta identificar de qué bloqueo de activación se trata y asígnale un nombre diferente.