[QA]ANR是个啥?
题外话:哎,太菜逼了,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.定位
- 首先分析log
- 从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了~ - 看代码
- 仔细查看ANR的成因(iowait?block?memoryleak?)