¿Qué es ANR y cómo se puede prevenir en Android?

ANR significa Aplicación que no responde . Se producirá un ANR si está ejecutando un proceso en el subproceso de la interfaz de usuario que lleva un tiempo prolongado , generalmente alrededor de 5 segundos. Durante este punto, la GUI (interfaz gráfica de usuario) se bloqueará, lo que puede terminar en que cualquier cosa que presione el usuario no se llevará a cabo. Después de los 5 segundos aprox. ha ocurrido, si el hilo aún no se ha recuperado, se muestra un cuadro de diálogo ANR que informa al usuario que el dispositivo no responde y puede darle la opción de esperar, con la esperanza de que la aplicación finalmente se recupere, o para forzar el cierre de la aplicación. Así es como el

ANR dialog displayed to the user

Un bloqueo es cuando se lanza una excepción dentro de la aplicación que no se ha manejado. Por ejemplo, si está tratando de establecer el texto de un componente EditText , pero EditText es nulo y no hay una instrucción try-catch para capturar la excepción, entonces su aplicación se bloqueará y se puede forzar el cierre. El usuario no verá qué causó el bloqueo , se le mostrará un diálogo que le informará que la aplicación se cerró inesperadamente y puede darle la opción de enviar un informe de error. Por ejemplo, un error causado por java.lang.NullPointerException es un ANR. Un ANR ocurre cuando se lleva a cabo una operación larga en el subproceso «principal».Este es el subproceso del bucle de eventos y, si está ocupado, Android no puede procesar más eventos de GUI dentro de la aplicación y, por lo tanto, presenta un cuadro de diálogo ANR. Ahora, dentro del seguimiento que publicaste, la mayoría de los hilos parecen estar funcionando bien, no hay problema. Está inactivo dentro de MessageQueue, esperando que regrese otro mensaje. En su caso, el ANR probablemente fue una operación más larga, en lugar de algo que bloqueó el subproceso de forma permanente, por lo que el subproceso del evento se recuperó después de que finalizó la operación y su seguimiento se realizó después del ANR.

¿Cómo prevenir una ANR?

Deja de hacer tareas pesadas en el hilo principal. En su lugar, use subprocesos de trabajo como IntentService, AsyncTask Handler u otro subproceso simplemente. Detectar dónde ocurren los ANR es sencillo si se trata de un bloqueo permanente ( interbloqueoadquirir algunos candados, por ejemplo), pero más difícil si se trata de un retraso de corta duración. En primer lugar, vuelva a evaluar su código y su apariencia en busca de puntos vulnerables y operaciones de ejecución prolongada. Los ejemplos pueden incluir el uso de sockets, bloqueos, suspensión de subprocesos y otras operaciones de bloqueo desde dentro del subproceso de eventos. Debe asegurarse de que todo esto suceda en hilos separados. Si nada parece importar, use DDMS y habilite la vista de subprocesos. Esto muestra todos los subprocesos en su aplicación similares a la traza que tiene. Reproduzca el ANR y actualice la mayor cantidad de subprocesos en un tiempo equivalente. Eso debería mostrarte exactamente lo que está sucediendo en el momento de la ANR. Se activará un ANR para su aplicación cuando ocurra una de las siguientes condiciones:

  1. Si bien su actividad está en primer plano, su aplicación no se ha alimentado con un evento de entrada o BroadcastReceiver (como eventos de pulsación de tecla o toque de pantalla) en 5 segundos.
  2. Si bien no está realizando una actividad en primer plano, su BroadcastReceiver no ha terminado de ejecutarse en una cantidad sustancial de su tiempo.

Si su aplicación está experimentando ANR, utilizará la guía de este artículo para diagnosticar y solucionar el problema.

signos vitales de Android

Android vitals puede ayudarlo a mejorar el rendimiento de su aplicación al alertarlo, a través de Play Console, cuando su aplicación muestre ANR excesivos. Android vitals considera que los ANR son excesivos cuando una aplicación:

  1. Exhiba un mínimo de un ANR en un mínimo de 0.47% de sus sesiones diarias.
  2. Exhibe 2 o más ANRs en un mínimo de 0.24% de sus sesiones diarias.
  3. Exhibe 3 o más ANRs en un mínimo de 0.17% de sus sesiones diarias.
  4. Exhibe 3 o más ANRs en un mínimo de 0.14% de sus sesiones diarias.

Diagnóstico de ANR

¡Los ANR se pueden resolver fácilmente ya que la interfaz de Android proporciona herramientas eficientes para eliminarlos! Encontrarlos puede incluir (pero no se limita a):

  1. La aplicación está realizando operaciones lentas que involucran la operación de E/S del sistema operativo.
  2. El subproceso principal está realizando una llamada de enlace síncrono a un proceso diferente, que otro proceso está tardando más tiempo en devolver.
  3. El subproceso principal está durante un interbloqueo con otro subproceso, ya sea en su proceso o mediante una llamada de enlace. la mayoría de los subprocesos no solo esperan que finalice una operación extendida, sino que se encuentran durante una situación de interbloqueo.
  4. La aplicación está haciendo un cálculo extendido en el hilo básico.

Uso del modo estricto de Android (nivel de API > 9)

Iniciar el nivel 9 de la API con StrictMode lo ayudará a descubrir ciertas operaciones de E/S accidentales en la mayoría de los subprocesos mientras desarrolla su aplicación. utilizará StrictMode en el nivel de dispositivo o actividad. Lea más sobre cómo usar StrictMode aquí .

Además, también puede obtener información sobre los ANR extrayendo un archivo de seguimiento de Android ADB de la siguiente manera:

adb root
adb shell ls /data/anr
adb pull /data/anr/<filename>

Pero si sus usuarios aún experimentan ANR, seguramente verificará el estado del hilo principal también conocido como principal en Android Device Monitor. Por lo general, el subproceso principal está en estado EJECUTABLE si está listo para actualizar la interfaz de usuario y, en general, responde si todo está bien.

Un ejemplo

Java

@Override
public void onClick(View view) {
    // This task works on the 
    // main thread and will cause an ANR.
    MergeSort.sort(data);
}

En el caso mencionado anteriormente, lo que debemos hacer es eliminar el proceso de clasificación del subproceso principal y colocarlo en otra clase o subproceso, para que el sistema pueda manejarlo de forma asíncrona.

Una punta

Cuando ocurre un ANR y su aplicación falla de la nada, Android Studio registra información relacionada con el caso en un archivo txt en el propio dispositivo. Puede usar ADB para recopilar registros y echar un vistazo. ¡También puede agregar Crashlytics de Firebase para detectar ANR cuando ocurren en su aplicación, y obtener su frecuencia y el evento del hilo de actividad en el que ocurrió! Ver más detalles sobre ANR visitando aquí .

Publicación traducida automáticamente

Artículo escrito por therebootedcoder y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *