ANR(Application Not Responding)应用程序无响应
导致ANR异常的原因很多:
InputDispatching Timeout:5秒内无法响应屏幕触摸事件或键盘输入事件
BroadcastQueue Timeout :在执行前台广播(BroadcastReceiver)的onReceive()函数时10秒没有处理完成,后台为60秒
Service Timeout :前台服务20秒内,后台服务在200秒内没有执行完毕
ContentProvider Timeout :ContentProvider的publish在10s内没进行完 (以上四条是复制网上总结,感觉总结很到位)
相信大家在开发中偶尔也会碰到此类问题,此文章重点介绍如何追踪查找错误
制造ANR
非常简单,一个页面两个按钮设置点击事件,一个调用Thread.sleep(50000),另一个点击修改页面布局
ANR追踪分析
1,AndroidStudio Logcat查看
通过查看Logcat的方法只能看一个大概,告诉你主线程等待异常;
2,traces.txt
app每次出现anr异常,系统都会记录到手机的traces.txt文件中,所以,出现anr可通过查看traces.txt追踪异常;
对adb不了解的可先看下Android adb shell 常用命令https://www.cnblogs.com/abeam/p/8908225.html
配置好adb以后查找traces.txt文件(声明:不需要root)
window + R ,输入cmd 打开命令窗口:
①adb shell (链接设备)
②cd /data/anr (进入/data/anr目录下)
③ls (查看当前目录下文件)
④ctrl + d 退出
⑤adb pull data/anr/traces.txt c:\anr (可将文件导入到c盘anr文件中,如果出现以下异常,需按照另外一种办法解决)
出现这种异常需使用另外一个命令导出
//6.0及以下设备
adb bugreport > bugreport.txt
//7.0及以上设备
adb bugreport bugreport.zip
压缩成功,可以先查看以下,然后导出:
然后到电脑C盘anr文件夹中解压压缩包,找到 FS文件夹 ----> data文件夹 ----> anr文件夹
打开查找anr异常
可精准定位到异常;
其实造成ANR异常的原因很多,主线程阻塞,CPU满负荷,内存不足,还有上面说的各大组件ANR,只能说尽量避免吧!