ANR 梳理

47 篇文章 0 订阅
1 篇文章 0 订阅

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 的模拟

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值