Android 在应用程序中全局捕获ANR

Android 在应用程序中全局捕获ANR,android,Android,我只是想知道是否有任何方法可以通过触发任何事件函数或至少捕获它来获取ANR通知。尽管在单独的线程中运行了很长的进程,但仍有可能存在ANR。所以我只想做的是,当应用程序检测到ANR时,它必须自动处理一些功能。请帮助我如何实现。谢谢您可以。您可以使用侦听日志的服务(最好是前台服务)(使用线程),如果有指示ANR的日志,请处理它 下面是一个导致ANR的应用程序的小示例: ... findViewById(R.id.button).setOnClickListener(new OnClickListen

我只是想知道是否有任何方法可以通过触发任何事件函数或至少捕获它来获取ANR通知。尽管在单独的线程中运行了很长的进程,但仍有可能存在ANR。所以我只想做的是,当应用程序检测到ANR时,它必须自动处理一些功能。请帮助我如何实现。谢谢您可以。

您可以使用侦听日志的服务(最好是前台服务)(使用线程),如果有指示ANR的日志,请处理它

下面是一个导致ANR的应用程序的小示例:

...
findViewById(R.id.button).setOnClickListener(new OnClickListener()
  {
    @Override
    public void onClick(final View v)
      {
      try
        {
        Thread.sleep(10000);
        }
      catch(final InterruptedException e)
        {
        // TODO Auto-generated catch block
        e.printStackTrace();
        }
      }
  });
...
这是我拿到ANR时从logcat那里得到的日志:

08-03 13:02:37.746: E/ActivityManager(158): ANR in com.example.anr (com.example.anr/.MainActivity)
08-03 13:02:37.746: E/ActivityManager(158): Reason: keyDispatchingTimedOut
08-03 13:02:37.746: E/ActivityManager(158): Load: 6.19 / 2.37 / 0.86
08-03 13:02:37.746: E/ActivityManager(158): CPU usage from 5598ms to 0ms ago:
08-03 13:02:37.746: E/ActivityManager(158):   2.6% 158/system_server: 2.5% user + 0.1% kernel / faults: 86 minor
08-03 13:02:37.746: E/ActivityManager(158):   0.5% 298/com.android.phone: 0.3% user + 0.1% kernel / faults: 15 minor
08-03 13:02:37.746: E/ActivityManager(158):   0% 35/rild: 0% user + 0% kernel
08-03 13:02:37.746: E/ActivityManager(158): 4.6% TOTAL: 3.9% user + 0.6% kernel
08-03 13:02:37.746: E/ActivityManager(158): CPU usage from 2029ms to 2654ms later:
08-03 13:02:37.746: E/ActivityManager(158):   11% 158/system_server: 4.8% user + 6.4% kernel / faults: 2 minor
08-03 13:02:37.746: E/ActivityManager(158):     11% 192/InputDispatcher: 4.8% user + 6.4% kernel
08-03 13:02:37.746: E/ActivityManager(158):     1.6% 163/Compiler: 1.6% user + 0% kernel
08-03 13:02:37.746: E/ActivityManager(158):     1.6% 193/InputReader: 0% user + 1.6% kernel
08-03 13:02:37.746: E/ActivityManager(158): 18% TOTAL: 9.3% user + 9.3% kernel

因此,是的,我认为这是可能的。

对于Jelly Bean来说,这是不可能的,因为您无法从其他进程或操作系统读取日志。此外,读取日志不是Android SDK的一部分。正确。因为我没有JB,我看不出是否有任何解决方法。他们在google IO中说,即使现在它不起作用,阅读你自己应用程序的日志也没关系,所以我不知道这样的事情是否被认为是在应用程序内部(我想不是)。无论如何,这个解决方案从一开始就是一个解决办法。目前,它应该适用于99%的设备。“尽管在单独的线程中运行很长的进程,但仍有可能出现ANR”——然后修复应用程序中的错误。我认为这可以帮助您