ANR的定义
ANR全称是Application Not Responding(应用程序无响应),在Android上,应用程序如果没有响应,系统会向用户显示一个对话框,这个对话框称作应用程序无响应对话框。用户可以选择等待或者强制关闭。所以一个流畅的合理的应用程序中不能出现ANR,而让用户每次都要处理这个对话框,因此,程序里对响应性能的设计很重要,这样系统不会显示ANR给用户。
应用程序出现ANR的原因
1.按键或触摸事件在特定时间(5 seconds)内无响应,
2.BroadcastRecetver在特定时间(10 seconds)内无法处理完成,
3.Service在特定时间(20 seconds)内无法处理完成,
4.UI线程被其他操作阻塞(子线程调用UI线程的join方法);
5.主线程存在耗时操作(本地IO操作、网络访问、循环等)
如何分析ANR
1、CPU 问题
在 Monkeylog.log 文件中定位到 “anr in” 位置,查看 cpu usage ?total 占用,如发现接近100%,暂时判断为 cpu 问题。然后在 logcat.log 文件中定位到 “not responding” 发生时间,并截取cpuinfo.log 中时间点前后 5s 的 log,然后计算 CPU 占中,看哪个进程用的多,在酌情分析模块的 CPU 占中。
2、GC 问题
定位到 logcat.log 文件中 “not responding” 发生时间点;
查看发生 ANR 时间点对应的 trace 文件,定位到应用包名package,若Dalvik Thread主线程显示“SUSPENDED”,则为内存问题。
截取 ANR 发生时间点前 5s 的 log,分析 “dalvikvm” 打印的 Paused GC 耗时,如果过多则定位为 GC 问题,需要查看这 5s 件发生了哪些耗时的操作。
如何避免ANR
注意:发生 GC 的进程 id 需要和当前发生 ANR 的线程 id 的要一致
1.合理使用 UI 主线程,耗时操作放入其他线程工作;
2.合理使用 Handler?异步消息处理机制来处理其他线程请求。
3.合理使用并遵循 Android 生命周期, 避免在 onCreate() and onResume()做过多的事情;
4.使用一些架构形成规范来避免内存等问题,例如:MVP、RxJava;
5.经常使用工具来检查内存问题,例如:MAT、TraceView、AS 自带等工具;
6.避免加载大图片引起内存不足导致 ANR;
避免内存泄露引起的 ANR。
ANR异常也是在程序中自己经常遇到的问题,主要的解决办法把耗时的操作放在子线程中来实现,比如采用Handler+mesage的方式,或者是有时候需要做一些和网络相互交互的耗时操作就采用asyntask异步任务的方式(它的底层其实Handler+mesage有所区别的是它是线程池)等。
面试:如何快速找到应用程序出现ANR的原
查看Log和trace文件可以快速找到ANR的原因