Android-出于测试目的强制ANR

Android-出于测试目的强制ANR,android,android-anr-dialog,Android,Android Anr Dialog,为什么我不能用这个代码强制Android? 没有日志消息或弹出窗口。应用程序只是缓慢地启动 [更新] 我甚至睡不着View.setOnClickListener或BroadcastReceiver.onReceive 有把戏吗 public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate

为什么我不能用这个代码强制Android? 没有日志消息或弹出窗口。应用程序只是缓慢地启动

[更新]

我甚至睡不着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);
        }
    }
}
我正在使用三星GT-6200L和Android 3.2

尝试使用:

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

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

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


在你的活动中做一个按钮

public void onBtn1(View v) {
   int a = 0;
   while(true) {
      a++;
   }
}
使按钮执行上述代码。
垃圾邮件用手指点击按钮=)

我昨天也遇到了同样的问题,我发现使用简单的调试构建ANR对话框根本不会出现。(尽管UI线程已完全挂起。)


但是在导出并正确签署应用程序后,对话框会正确弹出(在上述所有情况下)。然而,我仍然不确定是什么真正阻止了弹出ANR消息,也许其他人可以稍后澄清这一点…

我将此代码用于强制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的按钮:应用程序由于死锁而挂起

其要点是:

  • 在活动中将锁对象准备为私有字段:
    final Object mutex=new Object()

  • 有一个线程在关键部分执行一些工作,还有一个
    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);
    

  • 例如,将上面的代码片段放入按钮单击处理程序中应该可以做到这一点。

    如果UI线程中还没有onCreate,请尝试在onStart或onResume@nininhoonCreate不能不在UI线程上Android 4.0中的开发者有一个选项——“显示所有ANR”或类似的东西。也许你在安卓3.2上有这样的选择?它在默认情况下是关闭的,所以普通用户不会受到干扰。非常奇怪。。。我甚至睡不着View.setOnClickListener或BroadcastReceiver.onReceive…@Kzinch我在设置>开发者选项的ICS/JellyBeans中看到了这一点。不幸的是,至少在三星GT-6200中,3.2中没有这个选项……真的吗?我在我的设备上试过了,效果很好。这一定有用。Thread.sleep始终执行,除非被中断(您可以通过logcat消息检查),否则它将保留程序,并且如果程序在3秒内没有响应任何回调,android将抛出ANR。@CelinHC当主线程上没有发生任何其他事件时,您将不会立即看到ANR弹出。你必须等待它,或者你可以按下后退按钮并等待几秒钟来触发它。@Albert JanVerhees这可能是我期待已久的答案。我会测试它。因为Android给了应用很多时间去做工作,如果它没有任何需要响应的东西(直到达到阈值),但是如果需要响应某个东西,而应用没有响应,则会出现ANR。如果你在设备设置的开发者选项中打开此功能,它们会显示出来
    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);