【问题标题】:ANR at android.os.MessageQueue.nativePollOnceandroid.os.MessageQueue.nativePollOnce 的 ANR
【发布时间】:2022-10-17 15:10:50
【问题描述】:

我们在应用程序的不同部分看到了此 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 时,此线程处于空闲状态。我们没有足够的 信息以确定根本原因。

【问题讨论】:

  • 昨天我也发生了 Android 11 和各种设备,主要包括三星和摩托罗拉。
  • @Harminder 你有什么解决办法吗?
  • @sumitsingh 还没有
  • 仅在三星 Android 11 设备上获得大量 ANR。它似乎与 Firebase 版本有关,因为它发生在我将 Firebase-bom 从 28.4.2 升级到 29.3.1 之后。在此更改之前有 0 ANR。并且所有 ANR 堆栈跟踪都无法使用,它是在使用应用程序时随机发生的。
  • 稍微研究了一下,看起来firebase 只是在28.4.3 中开始报告 ANR

标签: android firebase performance android-anr-dialog android-looper


【解决方案1】:

面临同样的问题 - 我读过它与 Admob 或统一广告有关,并且有一个针对谷歌的开放线程:https://issuetracker.google.com/issues/230950647?pli=1

【讨论】:

    【解决方案2】:

    在最新发布的云消息传递依赖关系v23.0.7Firebase 提到此版本可能会降低 ANR。这是documentation中提到的他的话。

    消息广播现在在绑定到服务后立即结束。此更改应减少 ANR 的机会

    【讨论】:

    • 不幸的是,我们仍然看到 v23.0.7 的 ANR。
    【解决方案3】:

    NativePollOnce:

    它在 CPU 等待新任务/消息时出现。

    原因:

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

      收集 ANR 的方法:

      1. 看门狗
      2. 捕获本机 SIGQUIT
      3. ApplicationExitInfo(由 crashalytics 使用)
      4. 从 Google Play 控制台收集
      5. Firebase(firebase 仅从 android 11 及更高版本收集)

        解决 ANR 的挑战:

        揭开 ANR 之谜的神秘面纱。 Link

        解决方案:

        1. 优化初始化和广告加载。 Link
        2. 如果您正在使用媒体,则在 IO 线程中释放它
        3. 使用泄漏 Canary 或 Android 查找内存泄漏以追踪 剖析器
        4. 将firebase降级到28.4.2(它不会收集ANR,但并不意味着它不会发生)
        5. 验证来自 UI 线程的 UI View 的所有调用
        6. 更多信息来自Issue Tracker
        7. 更多信息Stack Ans

    【讨论】:

      猜你喜欢
      • 2012-04-19
      • 2018-08-19
      • 2013-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-16
      • 1970-01-01
      • 2021-07-25
      相关资源
      最近更新 更多