Android – 强制ANR用于测试目的

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

[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); } } } 

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

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

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

昨天我一直面临同样的问题,我发现使用简单的调试构建ANR对话框根本不会出现。 (虽然UI线程被完全绞死了。)

但在导出并正确签署应用程序后,对话框会正确popup(在上面提到的每种情况下)。 但是我仍然不确定是什么阻止popupANR消息,也许其他人可以稍后澄清这个…

尝试使用:

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

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

在您的活动中创建一个按钮。

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

使按钮执行上面的代码。 垃圾邮件用你的手指点击按钮=)

我用这个代码强制ANR

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

我刚刚在xml文件中创建了一个简单的按钮,并设置了android:onClick=force

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); 

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