【问题标题】:Android - Forcing ANR for testing purposeAndroid - 出于测试目的强制 ANR
【发布时间】:2012-10-23 16:11:41
【问题描述】:

为什么我不能使用此代码强制 Android ANR? 没有日志消息或弹出。该应用程序只是延迟启动。

[更新]

我什至连 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);
        }
    }
}

我正在使用搭载 Android 3.2 的三星 GT-6200L

【问题讨论】:

  • 可能 onCreate 还没有在 UI 线程上,尝试在 onStart 或 onResume 上添加 sleep
  • @nininho onCreate 不能不在 UI 线程上
  • 在 Android 4.0 中有一个供开发人员使用的选项 - “显示所有 ANR”或类似的东西。也许您在 Android 3.2 上有这样的选择?默认关闭,免打扰普通用户。
  • 很奇怪...我什至睡 View.setOnClickListener 或 BroadcastReceiver.onReceive...
  • @Kzinch 我在 ICS/JellyBeans 的设置 > 开发人员选项中看到了这一点。不幸的是,在 3.2 中没有这个选项,至少在三星 GT-6200 中......

标签: android android-anr-dialog


【解决方案1】:

在 onTouchEvent 中试试。在 onCreate 中,您的 Activity 未完全运行

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

【讨论】:

  • 这必须工作。 Thread.sleep 总是被执行,除非被中断(你可以通过 logcat 消息检查),否则它将保持程序,如果程序在 3 秒内没有响应任何回调,android 将抛出 ANR。
  • @CelinHC 当主线程上没有其他事情发生时,您不会立即看到 ANR 弹出。您必须等待它,或者您可以通过按下后退按钮触发它并等待几秒钟。
  • @Albert-JanVerhees 这可能是我期待已久的答案。我会测试它。
  • 因为如果没有任何响应(直到达到阈值),Android 会为应用提供大量时间来完成工作,但如果需要响应某事而应用不响应响应抛出 ANR
【解决方案2】:

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

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

【讨论】:

  • 如果您在设备设置的开发者选项中打开此功能,它们将显示
【解决方案3】:

尝试使用:

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

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

【讨论】:

  • 真的吗?我在我的设备上试了一下,效果很好。
【解决方案4】:

ANR-WatchDog project 有一个 test app,它以可靠的方式产生 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);
    

例如,将上述代码 sn-p 放在按钮单击处理程序中应该可以解决问题。

【讨论】:

    【解决方案5】:

    在您的活动中制作一个按钮。

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

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

    【讨论】:

      【解决方案6】:

      我将此代码用于强制 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

      【讨论】:

        猜你喜欢
        • 2016-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-25
        • 1970-01-01
        • 1970-01-01
        • 2015-09-07
        相关资源
        最近更新 更多