2012-01-08 11 views
10

¿Hay alguna manera de recibir notificaciones cuando su aplicación desencadena una ANR (aplicación no responde)? ¿Similar al manejador de excepciones predeterminado?¿Escuchar y responder a ANR?

Anticipándose a las respuestas "¿qué harías con eso?", Solo inicie sesión. Sin hacer nada.

+3

@WarrenFaith Dude. ¿De qué estás hablando? Acepto respuestas satisfactorias. Si alguien responde, pero en realidad no responde la pregunta, no los acepto. La mayoría de mis preguntas son * realmente * difíciles, o no tienen una respuesta. Por lo general, cuando pregunto, he buscado mucho, y si es una pregunta de Android, y no puedo encontrar la respuesta por mí mismo, va a ser una pregunta realmente complicada. Mi representante 2K es de responder preguntas. Si mi aplicación está en el mercado, puedo ver bloqueos. Sorpresa desagradable. Quiero atraparlos yo mismo. –

+1

@WarrenFaith PS. Si puede decirme cómo atrapar ANR, lo prometo, su respuesta será aceptada. A juzgar por su "Si su aplicación está en el mercado ...", no sabes cómo, así que si respondes con eso, no lo" aceptaré ", porque no es la respuesta. ¿Verdad? ¿O se supone que debo aceptarlo solo porque lo escribiste? –

+2

@WarrenFaith PPS , si tu respuesta es "no puedes hacer eso", necesitas citar una fuente con un enlace. De lo contrario, es solo una suposición. –

Respuesta

1

No. A diferencia de las excepciones que ocurren dentro de la máquina virtual de su proceso que puede atrapar, el ANR es generado por un supervisor del sistema, fuera de su máquina virtual. Google ofrece info on triggers and avoidance

+0

Realmente creo que no hay forma para hacer esto, lo cual es bastante frustrante. Podría (tal vez) hacer algo especial con mi propia API e hilo para atrapar, pero parece bastante raro. –

0

puede utilizar un servicio (preferiblemente un servicio de primer plano) que escucha los registros (utilizando un hilo), y si hay un registro que indica el ANR, manejarlo.

He aquí una pequeña muestra de una aplicación que hace que la ANR:

... 
findViewById(R.id.button).setOnClickListener(new OnClickListener() 
    { 
    @Override 
    public void onClick(final View v) 
     { 
     try 
     { 
     Thread.sleep(10000); 
     } 
     catch(final InterruptedException e) 
     { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     } 
     } 
    }); 
... 

aquí es el registro que obtuve de la Logcat cuando llegué a la ANR:

08-03 13:02:37.746: E/ActivityManager(158): ANR in com.example.anr (com.example.anr/.MainActivity) 
08-03 13:02:37.746: E/ActivityManager(158): Reason: keyDispatchingTimedOut 
08-03 13:02:37.746: E/ActivityManager(158): Load: 6.19/2.37/0.86 
08-03 13:02:37.746: E/ActivityManager(158): CPU usage from 5598ms to 0ms ago: 
08-03 13:02:37.746: E/ActivityManager(158): 2.6% 158/system_server: 2.5% user + 0.1% kernel/faults: 86 minor 
08-03 13:02:37.746: E/ActivityManager(158): 0.5% 298/com.android.phone: 0.3% user + 0.1% kernel/faults: 15 minor 
08-03 13:02:37.746: E/ActivityManager(158): 0% 35/rild: 0% user + 0% kernel 
08-03 13:02:37.746: E/ActivityManager(158): 4.6% TOTAL: 3.9% user + 0.6% kernel 
08-03 13:02:37.746: E/ActivityManager(158): CPU usage from 2029ms to 2654ms later: 
08-03 13:02:37.746: E/ActivityManager(158): 11% 158/system_server: 4.8% user + 6.4% kernel/faults: 2 minor 
08-03 13:02:37.746: E/ActivityManager(158):  11% 192/InputDispatcher: 4.8% user + 6.4% kernel 
08-03 13:02:37.746: E/ActivityManager(158):  1.6% 163/Compiler: 1.6% user + 0% kernel 
08-03 13:02:37.746: E/ActivityManager(158):  1.6% 193/InputReader: 0% user + 1.6% kernel 
08-03 13:02:37.746: E/ActivityManager(158): 18% TOTAL: 9.3% user + 9.3% kernel 

Así que, sí, creo Es posible.

+0

No será posible a partir de Jelly Bean, ya que no podrá leer los registros de otros procesos o el sistema operativo. Además, leer los registros no es parte del SDK de Android. – CommonsWare

+0

correct.since no tengo JB, no puedo ver si hay soluciones para esto. dijeron en el Google IO que aunque ahora no funcionará, está bien leer los registros de su propia aplicación, así que no sé si se considera que algo así está dentro de la aplicación (supongo que no) De todos modos, esta solución es una solución desde el principio. debería funcionar para aproximadamente el 99% de los dispositivos actualmente. –

+0

Tengo otra idea. Se publicará en la sección de respuestas. –

5

He estado pensando en esto un poco. Usted podría hacer lo siguiente, aunque es bastante pesado. escritura cabo de unos hilos ANR presentar a un directorio general legibles:

/data/anr/traces.txt

Usted podría tener un servicio, en un proceso diferente, encuesta que presentar periódicamente. Si la fecha cambia y tu aplicación está en la parte superior, entonces probablemente tengas un evento ANR.

Aunque no estoy 100% seguro del formato del archivo.

+0

Esta es mi respuesta favorita. Tengo que intentar eso. No estoy seguro de que el formato del archivo importe: contendrá el nombre del paquete de la aplicación, para que pueda asegurarse de que sea su aplicación la que lo generó. Sin embargo, nos preguntamos si los observadores del sistema de archivos trabajarían en ese archivo. Luego, en cada cambio puede verificar si contiene el nombre de su paquete. También podría verificarse en el inicio de la aplicación, para verificar si el usuario ha eliminado la aplicación después de la ANR. – 3c71

3

Como el watchdog del sistema no advierte a la aplicación, la misma aplicación puede tener su propio watchdog. Los pasos son sencillos, simplemente iniciar un hilo que los bucles de la siguiente manera:

  1. Horario pequeño código a ejecutar en el subproceso de interfaz de usuario tan pronto como sea posible.
  2. Espere X segundos (usted decide).
  3. Ver si se ejecutó el código: si lo tiene, vuelva a 1
  4. Si el código no se ha ejecutado, significa que el subproceso de la interfaz de usuario se ha bloqueado durante al menos X segundos, genera una excepción con el subproceso de interfaz de usuario seguimiento de pila

He escrito a small library that does exactly that y que uso con ACRA.

Espero que ayude;)

Cuestiones relacionadas