Android ANR

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定位和修正

 

可以通过查看/data/anr/traces.txt查看ANR信息。

根本原因是:主线程被卡了,导致应用在5秒时间未响应用户的输入事件。

很多种ANR错误出现的场景:

1) 主线程当中执行IO/网络操作,容易阻塞。

2) 主线程当中执行了耗时的计算。----自定义控件的时候onDraw方法里面经常这么做。

(同时聊一聊自定义控件的性能优化:在onDraw里面创建对象容易导致内存抖动---绘制动作会大量不断调用,产生大量垃圾对象导致GC很频繁就造成了内存抖动。)内存抖动就容易造成UI出现掉帧卡顿的问题

3) BroadCastReceiver没有在10秒内完成处理。

4) BroadCastReceiver的onReceived代码中也要尽量减少耗时的操作,建议使用IntentService处理。

5) Service执行了耗时的操作,因为service也是在主线程当中执行的,所以耗时操作应该在service里面开启子线程来做。

6) 使用AsyncTask处理耗时的IO等操作。

7) 使用Thread或者HandlerThread时,使用Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)或者java.lang.Thread.setPriority(int priority)设置优先级为后台优先级,这样可以让其他的多线程并发消耗CPU的时间会减少,有利于主线程的处理。

8) Activity的onCreate和onResume回调中尽量耗时的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值