Android - 强制ANR进行测试

Cel*_*nHC 7 android android-anr-dialog

为什么我不能用这段代码强制Android ANR?没有日志消息或弹出.该应用程序只是懒洋洋地推出.

[UPDATE]

我甚至不能在View.setOnClickListener或BroadcastReceiver.onReceive上睡觉!

有诀窍吗?

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用三星GT-6200L和Android 3.2

Nik*_*kyD 8

在onTouchEvent中尝试一下.在onCreate中,您的活动未完全运行

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


MrM*_*ter 5

ANR -WatchDog 项目有一个测试应用程序,可以以可靠的方式生成 ANR(与 ANR 一样可靠):该应用程序因死锁而挂起。

其要点:

  1. 准备一个锁对象作为活动中的私有字段: final Object mutex = new Object();

  2. 有一个线程在关键部分执行某些工作,以及一个android.os.Handler根据同一锁发布工作的线程。

    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);
    
    Run Code Online (Sandbox Code Playgroud)

例如,将上述代码片段放入按钮单击处理程序中应该可以解决问题。


Rag*_*ood 3

尝试使用:

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

您的代码可能无法工作,因为它设置得太早,并且 Activity 可能尚未完全初始化和创建。使用上述代码,启动 Activity 并在屏幕上触摸/滑动,然后等待 ANR 对话框弹出。