美文网首页
[QA]ANR是个啥?

[QA]ANR是个啥?

作者: yumiii_ | 来源:发表于2019-04-21 22:34 被阅读0次

题外话:哎,太菜逼了,java不会导致基本看不太懂。大概就是一种每一个字我都认识,合一起都看不懂的感觉。总之先记录下来把,后面有新的再整理进来。
2019/04/19 出现了一个退出登陆ANR的bug。所以ANR和Crash的区别到底在哪里呢?

一、ANR (Application Not Responding)

1.是什么?

当操作在一段时间内系统无法处理时,会弹出一个弹窗显示表示应用程序无响应。

为什么会产生ANR?

KeyDispatchTimeout(5 seconds) ——主要类型按键或触摸事件在特定时间内无响应。
BroadcastTimeout(10 seconds) ——BroadcastReceiver在特定时间内无法处理完成。

每次广播到来时,会重新创建 BroadcastReceiver 对象,并且调用 onReceive() 方法,执行完以后该对象即被销毁。当 onReceive() 方法在 10 秒内没有执行完毕,Android会认为该程序无响应。所以在BroadcastReceiver 里不能做一些比较耗时的操作 , 否侧会弹出 ANR的对话框。

ServiceTimeout(20 seconds) ——小概率类型 Service在特定的时间内无法处理完成。

超时一般有两种原因,一是当前的事件没有机会得到处理(即UI线程正在处理前一个事件,没有及时的完成或者looper被某种原因阻塞住了),二是当前的事件正在处理,但没有及时完成。

3.怎么解决ANR

Android中主线程更新UI,子线程执行耗时操作。不要在主线程做繁重的操作。 尽量用Handler来处理UIthread和别的thread之间的交互。

如果所有的工作都在UI线程,一些比较耗时的工作比如(访问网络,下载数据,查询数据库等),很容易造成主线程的阻塞,导致事件停止分发(包括绘制事件)。轻则降低用户体验,更坏的情况是,如果主线程被阻塞超过5秒,就会导致ANR,弹出应用程序没有响应,是等待还是关闭的警告

4.定位

  1. 首先分析log
  2. 从trace.txt文件查看调用stack.
    ANR产生时, 系统会生成一个traces.txt的文件放在/data/anr/下. 可以通过adb命令adb pull data/anr/traces.txt .将其导出到本地。
    P0级别的信息: Did、堆栈信息(如有)、app版本号、ci 链接。
    P1级别的信息: trace.txt(对故障机执行adb pull /data/anr/ ~/Desktop/yourpath/ 将导出的trace相关文件打包附在JIRA上 ) mapping文件(可在ci上找到)等
    提供这些信息基本上就ok了~
  3. 看代码
  4. 仔细查看ANR的成因(iowait?block?memoryleak?)

待看待整理:https://www.jianshu.com/p/3959a601cea6

相关文章

网友评论

      本文标题:[QA]ANR是个啥?

      本文链接:https://www.haomeiwen.com/subject/upksgqtx.html