ANR at android.os.MessageQueue.nativePollOnce

100

我们在应用的不同部分看到了这个ANR。想要了解是什么导致了这个ANR?

main (native): tid=1 systid=31940
#00 pc 0x5431c libc.so 
#01 pc 0x1313a5 libart.so 
#02 pc 0x2ab05b libart.so 
#03 pc 0x3659 libnativehelper.so 
#04 pc 0x9dee9 libandroid_runtime.so 
#05 pc 0x65c45 libgui.so 
#06 pc 0x11dcd libutils.so 
#07 pc 0x11abf libutils.so 
#08 pc 0xbcc7d libandroid_runtime.so 
       at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
       at android.os.MessageQueue.next(MessageQueue.java:339)
       at android.os.Looper.loop(Looper.java:199)
       at android.app.ActivityThread.main(ActivityThread.java:8276)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:612)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1006)

以下是Firebase对ANR的描述 -

当ANR发生时,此线程处于空闲状态。我们没有足够的信息来确定根本原因。


7
我也遇到了类似的问题,发生在昨天,使用的设备主要是三星和摩托罗拉等装有 Android 11 的设备。 - Luciano Brum
6
仅在三星Android 11设备上出现许多ANR。这似乎与Firebase版本有关,因为在将Firebase-bom从28.4.2升级到29.3.1后不久发生了这种情况。在更改之前没有任何ANR。所有的ANR堆栈跟踪都无法使用,它会在随机使用应用程序时发生。 - Skyle
2
我稍微研究了一下,看起来 Firebase 只在 28.4.3 版本中开始报告 ANR。 - waterPoweredMonkey
我在我的Flutter应用的Crashlytics中也发现了这些ANR。 - Harsha
1
@TehleelMir 还没有。 - Harminder Singh
显示剩余15条评论
4个回答

21

NativePollOnce:

当CPU正在等待新的任务/消息时,它会出现。

原因:

  1. 如果广播接收器在10秒内未完成执行,可能会发生ANR。
  2. 在5秒内没有对输入事件做出响应。
  3. 如果应用程序错误地尝试显示对话框,但调用不是来自主线程,则可能会导致ANR。(注意:验证所有UI视图从UI线程调用)
  4. 可能由于内存泄漏而发生。
  5. Handler.postDelayed可能会引发问题。
  6. 这种类型的崩溃通常在堆栈转储发生时出现,一些应用程序的堆栈跟踪可能会在实际ANR时间之后被转储很长时间。
  7. 可能会在SCREEN_ON BROADCAST期间发生,并且谷歌广告正在使用SCREEN_ON BROADCAST。
  8. 可能会在垃圾回收过程中发生(通过Ezequiel Adrian的评论)。

收集ANR的方法:

  1. 看门狗
  2. 捕获本地SIGQUIT信号
  3. ApplicationExitInfo(由crashalytics使用)
  4. 从Google Play控制台收集
  5. Firebase(仅从Android 11及以上版本收集)

解决ANR问题的挑战:

揭开ANR之谜。链接

解决方案:

1. 优化初始化和广告加载。链接 2. 如果使用媒体,请在IO线程中释放它。 3. 使用泄漏检测工具或Android性能分析器查找内存泄漏。 4. 将Firebase降级到28.4.2版本(这不会收集ANR,但并不意味着不会发生)。 5. 验证所有UI视图的调用是否来自UI线程。 6. 更多信息请参考问题跟踪器。 7. 更多信息请参考Stack Ans

1
请添加到ANR(应用程序无响应)的原因中:垃圾收集进程。 - Ezequiel Adrian

8

3
在最新版本的云消息传递依赖项v23.0.7 Firebase中提到,此版本可能会减少ANR。以下是它在文档中提到的话:

绑定服务后,消息广播现在会立即完成。这个更改应该会降低ANR的几率。


4
很遗憾,我们在v23.0.7中仍然看到ANR。 - Eran Boudjnah

1

3
对我没用。仍然遇到ANR问题。 - miq0717

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接