一、什么是ANR
ANR是Android中的概念,全称Application Not Responding(应用程序无响应),会弹出:页面无响应的对话框。如何定位和避免是Android程序员的必备修养。
二、发生ANR的条件
应用程序的响应性是由ActivityManager和WindowManager系统服务监视的,当ANR发生条件满足时,就会弹出ANR的对话框。
- 1.Activity超过5秒无响应;
- 2.BroadcastReceiver超过10秒无响应;
- 3.ervice超过20秒无响应;
三、造成ANR的主要原因
当应用程序的UI线程响应超时才会引起ANR,超时产生的原因有两种:
- 1.当前事件被某个事件给阻塞掉了,例如UI线程正在响应另外的事件;
- 2.当前事件正在处理,但是由于耗时太长没有能及时的完成;
四、典型的ANR问题场景
- 1.应用程序UI线程存在耗时操作(在UI线程中进行网络请求、数据库操作文件操作),可能会导致UI线程无法及时处理用户输入等;
- 2.应用程序UI线程等待子线程释放某个锁,从而无法处理用户的请求的输入;
- 3.耗时操作的动画需要大量的计算工作,可能导致CPU负载过重;
- 4.垃圾设备中,弱网络,频繁操作
五、注意事项
- 1.主线程被IO操作阻塞;
- 2.Activity的所有生命周期回调都是执行在主线程的;
- 3.Service默认执行在主线程中;
- 4.BoardcastReceiver的回调onReceive()执行在主线程中;
- 5.AsyncTask的回调除了doInBackground,其他都是在主线程中;
- 6.没有使用子线程Looper的Handler的handlerMessage,post(Runnable)都是执行在主线程中;
六、如何解决ANR
ANR避免的思想:避免在主线程中做耗时操作。
- 1.使用AsyncTask处理耗时IO操作
- 2.使用Thread或HandlerThread提高优先级
- 3.使用Handler处理工作线程的耗时操作
- 4.Activity的onCreate和onResume回调尽量避免耗时操作
七、ANR定位和分析
ANR定位(traces文件):ANR日志存在/data/anr/traces.txt,可以分析logcat日志和traces文件的相关信息输出去定位出现ANR的原因。
主要包含以下几方面:
- 1.基本信息,包括进程名、进程号、包名、系统build号、ANR类型等;
- 2.CPU使用信息,包括活跃进程的CPU 平均占用率、IO情况等;
- 3.线程堆栈信息,所属进程包括发生ANR的进程、其父进程、最近有活动的3个进程等。
八、ANR的检测工具
BlockCanary使用方式和LeakCanary相同