Android – Forzar ANR para fines de prueba

¿Por qué no puedo forzar Android ANR con este código? No hay mensajes de registro o pop-up. La aplicación se acaba de lanzar perezosamente.

[ACTUALIZAR]

No puedo conseguirlo incluso durmiendo un View.setOnClickListener o BroadcastReceiver.onReceive!

¿Hay un truco?

public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); try { Thread.sleep(10000); } catch (InterruptedException e) { Log.e("Test", "", e); } } } 

Estoy usando Samsung GT-6200L con acciones Android 3.2

Pruébalo en onTouchEvent. En onCreate tu actividad no se ejecuta completamente

 @Override public boolean onTouchEvent(MotionEvent event) { Log.d(TAG,"onTouchEvent"); while(true) {} } 

Trate de usar:

 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); int a=0; while(true) { a++; } } 

Su código probablemente no funcionó porque se configuró demasiado temprano, y la actividad probablemente no se inicializó y creó completamente. Con el código anterior, inicie la actividad y toque / deslice en la pantalla y espere a que aparezca el cuadro de diálogo ANR.

He estado enfrentando el mismo problema ayer, y he descubierto que el uso de una simple depuración construir diálogos ANR simplemente no se mostrará. (Aunque el hilo de la interfaz de usuario estaba completamente ahorcado.)

Pero después de exportar y de firmar correctamente la aplicación los diálogos fueron aparecidos correctamente (en todos los casos mencionados arriba). Sin embargo, todavía no estoy seguro de lo que realmente impide que aparezca mensajes ANR, tal vez alguien más puede aclarar esto más tarde …

Haz un botón en tu actividad.

 public void onBtn1(View v) { int a = 0; while(true) { a++; } } 

Haga que el botón ejecute el código anterior. Spam haga clic en el botón con el dedo =)

He utilizado este código para la fuerza ANR

  @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void force(View view){ while(true) {} } 

Acabo de crear un botón simple en el archivo xml y establecer android:onClick=force

El proyecto ANR-WatchDog tiene una aplicación de prueba que produce ANRs de una manera fiable (tan confiable como ANRs puede ser): la aplicación se bloquea debido a un bloqueo.

La esencia de la misma:

  1. Prepare un objeto de bloqueo como un campo privado en su actividad: final Object mutex = new Object();

  2. Tenga un hilo que realice un cierto trabajo en una sección crítica, y un android.os.Handler que fije el trabajo dependiendo del mismo bloqueo.

     new Thread(new Runnable() { @Override public void run() { synchronized (mutex) { while (true) { try { Thread.sleep(60000); } catch (InterruptedException e) { e.printStackTrace(); } } } } }).start(); new Handler().postDelayed(new Runnable() { @Override public void run() { synchronized (mutex) { // Shouldn't happen throw new IllegalStateException(); } } }, 1000); 

Poner el fragmento de código anterior dentro de un controlador de clic de botón, por ejemplo, debe hacer el truco.

Interesting Posts
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.