ANR 梳理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Gdeer/article/details/88736472

ANR 梳理

产生 ANR 的环境:

主线程阻塞

产生 ANR 的原因:

  1. 当前的事件没有机会得到处理(即主线程正在处理前一个事件,没有及时地完成,或Looper被某种原因阻塞住了)。
  2. 当前的事件正在处理,但没有及时完成。

产生 ANR 的触发点:

  1. KeyDispatchTimeout:输入事件(按键和触摸事件)5s 内没被处理
  2. BroadcastTimeout:BroadcastReceiver 的事件(onRecieve 方法)在规定时间内没处理完(前台10s,后台60s)
  3. ServiceTimeout:Service在规定时间内没处理完(前台20s,后台200s)
  4. ProcessContentProviderPublishTimedOutLocked:ContentProvider 的 publish 在 10s 内没处理完

常见场景:

  1. 主线程耗时操作,如复杂的 layout,庞大的 for 循环,IO 等
  2. 主线程被子线程同步锁 block(数据库操作)
  3. 主线程被 Binder 对端 block
  4. Binder 被占满导致主线程无法和 SystemServer 通信
  5. 得不到系统资源(CPU/RAM/IO)

这些情况下,会导致主线程阻塞,创造出 ANR 产生的环境。

如何避免:
UI 线程尽量只做跟 UI 相关的工作,耗时操作放在子线程中。

如何排查:

  1. 分析 log(查看触发点)

    • 小米 Mix 2 上,如果 logcat 中没有 ANR 的 log,可到/data/anr/anr_info_{packageName}_{time}.txt 查看。
  2. 查看 trace.txt(查看发生环境)

    • root 的手机,anr 的 trace 可以在 device file explorer 点击后,直接在 as 中查看
    • 非 root 的手机,adb pull /data/anr/traces.txt
  3. 看代码

  4. 对照 ANR 出现的常见场景,猜测验证

ANR 的模拟

见这里:ANR 的模拟

猜你喜欢

转载自blog.csdn.net/Gdeer/article/details/88736472
ANR
今日推荐