ANR响应知识

ANR:Application Not Responding,即应用程序无响应

一、ANR是如何产生的?
ANR产生条件:

主线程:只有应用程序进程的主线程响应超时才会产生ANR
超时时间:产生ANR的上下文不同,超时时间也不同,但只要超过这个时间上限没有响应就会产生ANR

超时原因有两种:

a.当前时间没有机会得到处理(即UI线程正在处理前一个事件,没有及时的完成或者looper被某种原因阻塞住了
b.当前事件正在处理,但没有及时完成

二、ANR的分类
1.产生ANR的上下文不同,导致ANR原因也不同,主要有以下三种情况:

● 应用进程的主线程对输入事件在5s内没有处理完毕;
● 应用进程的主线程在执行BroadcastRecevier的onReceive函数时10s内没有处理完毕;
● 应用进程的主线程在执行Service的各个生命周期函数时20s内没有处理完毕;

2.引起ANR的根本原因:
引起ANR的根本原因,总的来说可以归纳为两类:

● 应用进程自身引起的,比如:主线程阻塞、挂起、死循环,执行耗时操作等;
● 其他进程引起的,比如:其他进程CPU占用率过高,导致当前应用进程无法抢占到CPU时间片。常见的问题如文件读写频繁,io进程CPU占用率过高,导致当前应用出现ANR;

三、ANR的解决方法
1、主线程中需要做耗时操作时,比如网络访问、数据库操作及位图变换等,必须启动子线程处理(Activity的onCreate()和onResume();AsyncTask的onPreExecute()、onProgressUpdate()、onPostExecute()和onCancel();Handler的handleMessage()和run())里尽可能少的去做创建操作。(可以采用重新开启子线程的方式,然后使用Handler+Message的方式做一些操作,比如利用handler来更新主线程中的UI等)
2、应用程序应该避免在BroadcastReceiver里做耗时的操作或计算,且不要在子线程里去做这些事情(因为 BroadcastReceiver的生命周期短),而应该让应用程序应该启动一个 Service去处理。
3、避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。如果你的应用程序在响应Intent广播时需要向用户展示什么,你应该使用Notification Manager来实现。
4.在后台子线程处理耗时操作时,为了提高用户体验,可以在前台界面显示某些动画或者progressbar。
四、ANR原因分析方法
1.通过logcat日志分析原因:

其中的Reason信息可以给出ANR产生原因的一些详细信息,
1)输入事件处理引起的ANR,提示信息格式为:“Inputdispatching timed out [anr reason]”
2)Service处理引起的ANR,提示信息格式为:“Executingservice [Package name]/[Short class name]”
3)Broadcast处理引起的ANR,提示信息格式为:“Broadcast of [Intent focused byBroadcast receiver]”

04-01 13:12:14.123 I/Process( 220): Sending signal. PID: 21404 SIG: 3—发生ANR的时间和生成trace.txt的时间

04-0113:12:15.872 E/ActivityManager( 220): CPUusage from 4361ms to 699ms ago —-CPU在ANR发生前的使用情况

04-0113:12:15.872 E/ActivityManager( 220): 100%TOTAL: 4.8% user + 7.6% kernel + 87% iowait IOWait很高,说明当前系统在忙于I/O,因此数据库操作被阻塞

04-0113:12:15.872 E/ActivityManager( 220): CPUusage from 3697ms to 4223ms later:– ANR后CPU的使用量

从LOG可以看出ANR的类型,CPU的使用情况,如果CPU使用量接近100%,说明当前设备很忙,有可能是CPU饥饿导致了ANR
如果CPU使用量很少,说明主线程被BLOCK了
如果IOwait很高,说明ANR有可能是主线程在进行I/O操作造成的

Log的产生大家都知道 , 大家也都知道通过DDMS来看log , 但什么时候会产生log文件呢 ?一般在如下几种情况会产生log文件 。
1,程序异常退出 , uncausedexception
2,程序强制关闭 ,Force Closed(简称FC)
3,程序无响应 , ApplicationNo Response (简称ANR) ,顺便,一般主线程超过5秒没有处理就会ANR
4,手动生成 。

Log文件主要由三大部分组成:
1)系统基本信息 ,包括 内存,CPU ,进程队列 ,虚拟内存 , 垃圾回收等信息 。
MEMORY INFO(/proc/meminfo)
CPU INFO (top -n 1 -d 1 -m 30 -t)
PROCRANK (procrank)
VIRTUAL MEMORY STATS (/proc/vmstat)
VMALLOC INFO (/proc/vmallocinfo)
2)时间信息 , 也是我们主要分析的信息 。
VMALLOC INFO (/proc/vmallocinfo)
EVENT INFO (/proc/vmallocinfo)
3)虚拟机信息 , 包括进程的,线程的跟踪信息,这是用来跟踪进程和线程具体点的好地方 。
VM TRACES JUST NOW (/data/anr/traces.txt.bugreport: 2011-01-15 16:49:02)
VM TRACES AT LAST ANR (/data/anr/traces.txt: 2011-01-15 16:49:02)

2.通过trace文件分析原因:

除了看LOG,解决ANR还得需要trace.txt文件,
如何获取呢?可以用如下命令获取
1. chmod777/data/anr2. c h m o d 777 / d a t a / a n r 2. rm /data/anr/traces.txt
3. ps4. p s 4. kill -3 PID
5. adbpull data/anr/traces.txt ./mytraces.txt

DALVIK THREADS:
1. atandroid.os.MessageQueue.nativePollOnce(Native Method)
atandroid.os.MessageQueue.next(MessageQueue.java:119)
atandroid.os.Looper.loop(Looper.java:110)
说明主线程在等待下条消息进入消息队列

2.atorg.apache.harmony.luni.platform.OSNetworkSystem.receiveStream(OSNetworkSystem.java:478)
在UI线程进行网络数据的读写时超时,关于网络连接,在设计的时候可以设置个timeout的时间或者放入独立的线程来处理。

3.关键词:Memoryleak/Thread leak
“main”prio=5 tid=3 VMWAIT
atdalvik.system.VMRuntime.trackExternalAllocation(NativeMethod)内存不足导致block在创建bitmap上
atandroid.graphics.Bitmap.createBitmap(Bitmap.java:468)

解决:如果机器的内存族,可以修改虚拟机的内存为36M或更大,不过最好是复查代码,查看哪些内存没有释放

注:
观察log文件的基本步骤 :
1.如果是ANR问题 , 则搜索“ANR”关键词 。 快速定位到关键事件信息 。
2.如果是ForceClosed 和其它异常退出信息,则搜索”Fatal” 关键词,快速定位到关键事件信息。
3.定位到关键事件信息后, 如果信息不够明确的,再去搜索应用程序包的虚拟机信息 ,查看具体的进程和线程跟踪的日志,来定位到代码 。

01-15 16:49:02.433 E/ActivityManager( 2466): ANR in com.android.mms(com.android.mms/.ui.SlideshowActivity)
翻译:在16:49分2秒433毫秒的时候 ActivityManager (进程号为2466) 发生了如下错误:com.android.mms包下面的.ui.SlideshowActivity 无响应。

01-15 16:49:02.433 E/ActivityManager( 2466): Reason: keyDispatchingTimedOut
翻译:原因 ,keyDispatchingTimeOut - 按键分配超时

01-15 16:49:02.433 E/ActivityManager( 2466): Load: 0.6 / 0.61 / 0.42
翻译:5分钟,10分钟,15分钟内的平均负载分别为:0.6 , 0.61 , 0.42

参考网址:http://blog.csdn.net/chenzhihui_28/article/details/40374375

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值