ANR全称:Application Not Responding,即应用程序未响应。
主要原因:
应用程序进程中的主线程响应超时,则会产生ANR
(1)应用程序自身引起的。比如:主线程阻塞、挂起、死循环、执行比较长的耗时操作
(2)其他进程引起的。比如:其他进程对CPU的时间占用率过高,导致应用进程抢不到CPU的时间片。
响应超时体现:
(1)应用程序的主线程对输入事件,5s内没有处理完毕
(2)应用程序主线程在执行BroadcastReceiver的onReceive()函数时,10s内没有处理完毕
(3)应用程序主线程在执行Service的各个生命周期函数时,20s内没有处理完毕
解决步骤:
当发生ANR的时候,ActivityManagerService(AMS)会把ANR信息写到LogCat日志中。我们打开Android Device Monitor查看LogCat日志,主要通过ANRManager、ActivityManager等字段过滤出我们想要的信息,保存到文件。文件主要看以下几条信息:
(1)ANR In (Process Name)【Short Component Name】即ANR发生在哪个进程,哪个包/类里,定位到类。
(2)PID 应用程序进程ID
(3)Reason ANR发生的原因提示。有:Input dispatching timed out.(输入事件引起的ANR);ExecutingService...(Service执行任务引起的ANR);Broadcast of ...(广播引起的ANR)
(4)Process CPU state 分析各进程的时间占用率,来判断某些进程是否长期占用CPU过高,导致应用进程获取不到足够的CPU处理时间,而发生ANR。比如:各进程总的CPU占用率,用户CPU时间占用率、系统CPU时间占用率、iowaitCPU时间占用率
总结:
ANR在日常开发过程中,主要还是应用程序的主线程做了过多耗时操作导致,耗时操作放在子线程即可。