Identifica los bloqueos de activación creados por otras APIs

Varias bibliotecas y APIs del sistema pueden adquirir bloqueos de activación que se pueden atribuir a tu app. Esto 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, aunque no llames directamente a las APIs de bloqueo de activación.

En este documento, se enumeran algunos nombres comunes de bloqueos de activación que podrías ver cuando uses las herramientas de depuración de bloqueos 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 haya 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 funcionan mal 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 solucionarlo.

En este documento, se incluyen los siguientes nombres de bloqueos de activación. En cada caso, si bien otra biblioteca o API puede crear el bloqueo de activación, este se atribuye a la app que llamó a esa API.

*alarm*

AlarmManager adquiere este bloqueo de activación y lo 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.

Recomendación

Recomendamos las siguientes prácticas para optimizar el comportamiento de las alarmas:

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

AudioIn, AudioMix, etcétera

Las APIs de contenido multimedia adquieren varios bloqueos de activación cuyos nombres comienzan con Audio cuando se graba o reproduce audio. Los bloqueos de activación se atribuyen a la app que realiza la llamada.

AudioIn se adquiere durante la captura de AudioRecord en modo de cámara de video, mientras el micrófono está activo. AudioMix se adquiere durante la reproducción de AudioTrack en el dispositivo. Otras APIs de contenido multimedia pueden adquirir bloqueos de activación con otros nombres que comienzan con Audio.

Recomendación

Te recomendamos que sigas estas prácticas:

  • No uses nombres de bloqueos de activación que comiencen con Audio.
  • Si usas las APIs de contenido multimedia, 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 las APIs de contenido multimedia, finaliza la sesión cuando ya no la necesites.

GOOGLE_C2DM

GCM adquiere este 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 de transmisión de FCM onMessageReceived().

Recomendación

Recomendamos las siguientes 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.
  • Completa el método onMessageReceived() lo más rápido posible. Consulta la guía de Firebase para obtener más información.

*job*/<package_name>/<package_and_job_name>

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

"<package_name>" es el nombre del paquete de tu app, no el texto literal <package name>. Del mismo modo, "<package_and_job_name>" es el nombre del paquete seguido del nombre del trabajo. *job* es la secuencia de caracteres *job*, con asteriscos; los asteriscos no se usan como comodines. Este es un ejemplo de un nombre de bloqueo de activación de este tipo:

*job*/com.example.app/com.example.app.example.path.ExampleJobService

Recomendación

Audita el uso de las tareas de JobScheduler. En particular, sigue nuestras instrucciones para optimizar el uso de batería de las APIs de programación de tareas.

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

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

"<package_name>" es el nombre del paquete de tu app, no el texto literal <package name>. *job* es la secuencia de caracteres *job*, con asteriscos; los asteriscos no se usan como comodines.

Recomendación

Audita el uso de los trabajadores de WorkManager. En particular, sigue nuestras instrucciones para optimizar el uso de batería de las APIs de programación de tareas.

NetworkLocationLocator, FusedLocation, *location*

LocationManager y FusedLocationProviderClient usan estos nombres de bloqueo 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.

Recomendación

Optimiza el uso de la ubicación. Por ejemplo, establece tiempos de espera, solicitaciones de ubicación por lotes o usa actualizaciones de ubicación pasivas.

_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 pueden 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 cuál es y asignarle un nombre diferente.