如何从Activity和BroadcastReceiver重现应用程序无响应(ANR)

时间:2015-07-03 13:34:31

标签: android android-anr-dialog

我需要从Activity和BroadCastReceiver重现Application Not Responding(ANR)对话框。 我尝试创建一个简单的按钮点击:

 public void makeANRClick(View view){
    while (true);
}

使用此代码,我在Android 2.3.7的仿真器上重现了ANR。相同的代码不适用于具有最新Android版本(4 +)的真实设备。

另一种尝试如下:

public void onMakeANRClick(View view){
    try {
        Thread.sleep(15000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

这也没有帮助。 有什么建议吗?

4 个答案:

答案 0 :(得分:1)

看看StrictMode。还有video

“StrictMode是一个开发人员工具,可以检测您可能偶然发生的事情,并引起您的注意,以便您可以修复它们。”

答案 1 :(得分:1)

您还可以检查转储状态以检查有关您的流程的信息 https://source.android.com/devices/input/diagnostics.html

我重现你的代码,然后拉出'dumpstate_app_anr.txt.gz' 这是结果

PID TID PR CPU%S VSS RSS PCY UID Thread Proc

15287 15287 0 83%R 227152K 25152K fg u0_a135 a.stackoverflow mx.syca.stackoverflow

07-03 08:46:12.454 1618 1636 I ActivityManager:Killing proc 12946:mx.syca.stackoverflow / u0a135:强制停止

获得ANR对话花了大约2分钟

希望有所帮助

答案 2 :(得分:0)

关键字多线程。请阅读此主题http://developer.android.com/training/articles/perf-anr.html 此外,无法在Broadcast Reciever管理UI组件,因为它不是UI组件。 此外,开发选项中还有一个名为“Show All ANR”的选项

答案 3 :(得分:0)

我相信在java(dalvik)中执行ANR的最佳方法是执行荒谬的计算,包括函数调用。

也许类似于:

Integer useless = 0;
for (i=2147483648;i<2147483647;i++){
  useless = Math.random() * Math.random() * Math.random() * Math.random();
}

至少会在较弱的系统上触发一些延迟和ANR。