我是靠谱客的博主 潇洒保温杯,最近开发中收集的这篇文章主要介绍ANR 梳理ANR 梳理,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

最后

以上就是潇洒保温杯为你收集整理的ANR 梳理ANR 梳理的全部内容,希望文章能够帮你解决ANR 梳理ANR 梳理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部