Android(安卓)ANR原因分析(基于traces.txt文件),
16lz
2021-01-24
一,项目背景,
商业项目,用于商铺柜台接单的,需要使用Android的通话功能。在响铃瞬间,界面出现卡顿,接着导致整个相关联的通话软件卡段(包括系统通话软件)
二,导出traces.txt文件
adb shell pull /data/data/anr/traces.txt c:\traces.txt
三,分析文件
关键字 Cmd line,找到进程名称,
"main" prio=5 tid=1 Native
看到自己的包名就知道是从哪个包名哪个类出问题了。
一,导致ANR有以下几个方面
1,按键或触摸事件在特定时间内无响应
2,BroadcastReceiver在特定时间内(10秒)无法处理完成
3,Service在特定的时间内无法处理完成,具体的超时时间的定义在framework下的ActivityManagerService.java
二:为什么会超时呢?
超时时间的计数一般是从按键分发给app开始。超时的原因一般有两种:
1,当前的事件没有机会得到处理(即UI线程正在处理前一个事件,没有及时的完成或者looper被某种原因阻塞住了)
2,当前的事件正在处理,但没有及时完成
3,机器的cpu处理能力不够,不足以响应复杂的数据处理
三:如何避免KeyDispatchTimeout
1,UI线程尽量只做跟UI相关的工作
2,耗时的工作(比如数据库操作,I/O,连接网络或者别的有可能阻碍UI线程的操作)把它放入单独的线程处理
3,尽量用Handler来处理UIthread和别的thread之间的交互
更多相关文章
- android HandlerThread使用小例
- Android中消息处理机制-Handler剖析
- AsyncTask学习笔记
- onDraw调用和android中Invalidate和postInvalidate的区别
- Android(安卓)JSON使用(二):解读org.json包
- 一些databinding 赋值小技巧
- 拨云见日---android异步消息机制源码分析(二)
- Android(安卓)音视频学习系列(一) JNI 从入门到精通
- Android(安卓)扫一扫功能实现(Zbar)