application not response 简称ANR ,应用程序无响应。当应用在5秒内对用户输入或点击等事件无响应时,Android便会认为应用无响应,弹出ANR 提示窗
1.产生场景
activity内对事件 5秒无法完成处理
BroadcastReceiver 内对事件10秒无法完成处理
Service 的各个生命周期函数在特定时间(20秒)内无法完成处理
2.原理
Android 应用在启动时会创建一个UI线程,该线程只负责UI界面更新,在该线程中进行耗时操作会导致线程阻塞,可能引起ANR
3.定位分析
当一个进程发生了ANR了以后,系统会在/data/anr目录下创建一个文件traces.txt,通过分析这个文件就能定位出ANR的原因。
文件导出
adb pull /data/anr/traces.txt
或者也可以直接查看lockat日志进行分析
4.检测预防
1.使用Android SDK自带的StrictMode(严格模式)进行检测
StrictMode使用教程地址:
https://droidyue.com/blog/2015/09/26/android-tuning-tool-strictmode/
2.使用BlockCanary
BlockCanary是一个非侵入时的性能监控函数库,其特点有:
a.非侵入式,简单的两行就打开监控,不需要到处打点,破坏代码优雅性。
b.精准,输出的信息可以帮助定位到问题所在(精确到行),不需要像Logcat一样,慢慢去找。
目前包括了核心监控输出文件,以及UI显示卡顿信息功能且集成简单快速
教程:
https://www.jianshu.com/p/cd7fc77405ac
5.解决
解决方案写下来其实就是一句话的事:不要再主线程进行耗时操作,涉及网络请求、文件读取、数据库访问等耗时操作的事件尽量开一个子线程去执行。具体ANR 的避免还是需要在日常编码中注意规范。
网友评论