全称:
Application not response(应用程序未响应)
原因:
-
用户输入事件在5秒内没有处理完,当再一次发生输入事件时产生ANR。
-
前台广播在10秒内没有处理完成或者后台广播在60秒内没有处理完成,则产生ANR。
-
前台服务在20秒内没有处理完成或者后台服务在200秒内没有处理完成则发生ANR。
-
ContentProvider在10秒内没有处理完成发生ANR。
ANR定位和分析:
1、可以通过Logcat日志分析。
2、生成的位于手机内部存储的/data/anr/traces.txt文件进行分析和定位。(这个方法可能会碰到无权限问题)
adb shell
cd data/anr
ls
此时可以查看到目录下所有的traces.txt 文件(如果不确定生成的是哪个trace文件,可以通过adb shell ls -l /data/anr/查看,会带上文件时间)。
通过(Ctrl +D )退出 adb shell
然后执行导出命令:adb pull /data/anr/traces.txt D:\traces\mytraces.txt
此处 D:\traces\mytraces.txt为导出目标位置。
3、adb bugreport D:\log通过此命令可将日志压缩打包导出到指定位置。解压后可打开查看日志。
ADB环境配置:
1.在环境变量-系统变量下新增:
变量名:android
变量值:D:\xyd\android-tools\android-sdk\platform-tools (sdk下工具目录)
2.在path后面添加%android%; 若前面没;需要添加;
3.在命令行中输入adb有提示则配置成功
ANR的避免和检测
避免在主线程中作耗时操作。
检测工具:
StrictMode:严格模式StrictMode是Android SDK提供的一个用来检测代码中是否存在违规操作的工具类。主要检测两类问题:
线程策略ThreadPilicy,虚拟机策略VmPolicy。
BlockCanary:是一个非侵入式的性能监控函数库,用法和LeakCanary类似。只不过后者监控应用的内存泄漏,而BlockCanary监控应用主线程的卡顿。