概述
ANR 梳理
产生 ANR 的环境:
主线程阻塞
产生 ANR 的原因:
- 当前的事件没有机会得到处理(即主线程正在处理前一个事件,没有及时地完成,或Looper被某种原因阻塞住了)。
- 当前的事件正在处理,但没有及时完成。
产生 ANR 的触发点:
KeyDispatchTimeout
:输入事件(按键和触摸事件)5s 内没被处理BroadcastTimeout
:BroadcastReceiver 的事件(onRecieve 方法)在规定时间内没处理完(前台10s,后台60s)ServiceTimeout
:Service在规定时间内没处理完(前台20s,后台200s)ProcessContentProviderPublishTimedOutLocked
:ContentProvider 的 publish 在 10s 内没处理完
常见场景:
- 主线程耗时操作,如复杂的 layout,庞大的 for 循环,IO 等
- 主线程被子线程同步锁 block(数据库操作)
- 主线程被 Binder 对端 block
- Binder 被占满导致主线程无法和 SystemServer 通信
- 得不到系统资源(CPU/RAM/IO)
这些情况下,会导致主线程阻塞,创造出 ANR 产生的环境。
如何避免:
UI 线程尽量只做跟 UI 相关的工作,耗时操作放在子线程中。
如何排查:
-
分析 log(查看触发点)
- 小米 Mix 2 上,如果 logcat 中没有 ANR 的 log,可到
/data/anr/anr_info_{packageName}_{time}.txt
查看。
- 小米 Mix 2 上,如果 logcat 中没有 ANR 的 log,可到
-
查看 trace.txt(查看发生环境)
- root 的手机,anr 的 trace 可以在 device file explorer 点击后,直接在 as 中查看
- 非 root 的手机,
adb pull /data/anr/traces.txt
-
看代码
-
对照 ANR 出现的常见场景,猜测验证
ANR 的模拟
见这里:ANR 的模拟
最后
以上就是潇洒保温杯为你收集整理的ANR 梳理ANR 梳理的全部内容,希望文章能够帮你解决ANR 梳理ANR 梳理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复