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
- Audio y contenido multimedia
- Firebase Cloud Message (FCM)
- JobScheduler
- Ubicación
- WorkManager
_UNKNOWN
: Las herramientas de depuración lo muestran si el nombre del bloqueo de activación parece usar información de identificación personal (PII).
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.