以下为一段ANR的LOG,主要是在WindowManagerService.java和ActivityManagerService.java中实现。

W/WindowManager( 2183): Key dispatching timed out sending to com.android.camera/com.android.camera.Camera 
W/WindowManager( 2183): Previous dispatch state: {{KeyEvent{action=0
code=4 repeat=0 meta=0 scancode=158 mFlags=8} to Window{4622ad58
com.android.camera/com.android.camera.Camera paused=false} @ 5419631
lw=Window{4622ad58 com.android.camera/com.android.camera.Camera
paused=false} lb=android.os.BinderProxy@4622ab98 fin=false gfw=true
ed=true tts=0 wf=false fp=false mcf=Window{4622ad58
com.android.camera/com.android.camera.Camera paused=false}}} 
W/WindowManager( 2183): Current dispatch state: {{KeyEvent{action=1
code=4 repeat=0 meta=0 scancode=158 mFlags=8} to Window{4622ad58
com.android.camera/com.android.camera.Camera paused=false} @ 5424762
lw=Window{4622ad58 com.android.camera/com.android.camera.Camera
paused=false} lb=android.os.BinderProxy@4622ab98 fin=false gfw=true
ed=true tts=0 wf=false fp=false mcf=Window{4622ad58
com.android.camera/com.android.camera.Camera paused=false}}}

//以下为打开日志文件时,出现错误,所以把调用过程打印了出来。

W/ActivityManager( 2183): Unable to prepare ANR traces file: /data/local/anr/traces.txt 
W/ActivityManager( 2183): java.io.IOException: No such file or directory 
W/ActivityManager( 2183): at java.io.File.createNewFileImpl(Native Method) 
W/ActivityManager( 2183): at java.io.File.createNewFile(File.java:1160) 
W/ActivityManager( 2183): at com.android.server.am.ActivityManagerService.dumpStackTraces(ActivityManagerService.java:4801) 
W/ActivityManager( 2183): at com.android.server.am.ActivityManagerService.appNotResponding(ActivityManagerService.java:4875) 
W/ActivityManager( 2183): at com.android.server.am.HistoryRecord.keyDispatchingTimedOut(HistoryRecord.java:489) 
W/ActivityManager( 2183): at
com.android.server.WindowManagerService$KeyWaiter.waitForNextEventTarget(WindowManagerService.java:5825) 
W/ActivityManager( 2183): at com.android.server.WindowManagerService.dispatchKey(WindowManagerService.java:5367) 
W/ActivityManager( 2183): at com.android.server.WindowManagerService.access$1300(WindowManagerService.java:137) 
W/ActivityManager( 2183): at
com.android.server.WindowManagerService$InputDispatcherThread.process(WindowManagerService.java:6597) 
W/ActivityManager( 2183): at com.android.server.WindowManagerService$InputDispatcherThread.run(WindowManagerService.java:6482)

I/Process ( 2183): Sending signal. PID: 2640 SIG: 3 
I/dalvikvm( 2640): threadid=3: reacting to signal 3

//以下为出现ANR时的CPU信息

E/ActivityManager( 2183): ANR in com.android.camera (com.android.camera/.Camera) 
E/ActivityManager( 2183): Reason: keyDispatchingTimedOut 
E/ActivityManager( 2183): Load: 0.94 / 0.51 / 0.2 
E/ActivityManager( 2183): CPU usage from 10552ms to 14ms ago: 
E/ActivityManager( 2183): mediaserver: 10% = 9% user + 1% kernel / faults: 1081 minor 
E/ActivityManager( 2183): system_server: 7% = 2% user + 4% kernel / faults: 1484 minor 1 major 
E/ActivityManager( 2183): mmcqd: 3% = 0% user + 3% kernel 
E/ActivityManager( 2183): e168.wowgallery: 1% = 0% user + 0% kernel / faults: 30 minor 
E/ActivityManager( 2183): logcat: 0% = 0% user + 0% kernel 
E/ActivityManager( 2183): zygote: 0% = 0% user + 0% kernel 
E/ActivityManager( 2183): kblockd/0: 0% = 0% user + 0% kernel 
E/ActivityManager( 2183): usb_mass_storag: 0% = 0% user + 0% kernel 
E/ActivityManager( 2183): logcat: 0% = 0% user + 0% kernel 
E/ActivityManager( 2183): +.android.camera: 0% = 0% user + 0% kernel 
E/ActivityManager( 2183): +v4l2q: 0% = 0% user + 0% kernel 
E/ActivityManager( 2183): TOTAL: 64% = 14% user + 14% kernel + 33% iowait + 1% softirq 
E/dalvikvm( 2640): Unable to open stack trace file '/data/local/anr/traces.txt': No such file or directory 
I/XXX ( 2183): getThemeFilename: cookie = 1, path : /data/system/theme/framework/res/drawable-mdpi/ic_dialog_info.png 
I/XXX ( 2183): getThemeFilename: cookie = 1, path : /data/system/theme/framework/res/drawable-mdpi/ic_dialog_menu_generic.png 
I/XXX ( 2183): getThemeFilename: cookie = 1, path : /data/system/theme/framework/res/drawable-mdpi/ic_dialog_alert.png 
W/WindowManager( 2183): Continuing to wait for key to be dispatched

以下文件章转自:http://www.cnblogs.com/xirihanlin/archive/2010/01/07/1641621.html

可能会存在这样的情况,你写的代码通过了世界上所有的性能测试,但当用户尝试使用你的应用程序时,仍然让用户感到不爽。应用程序响应不够灵敏的地方包括------反映迟钝,挂起或冻结很长时间,或者需要花费很长的时间来处理输入。

在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应
(ANR:Application Not
Responding)对话框。用户可以选择让程序继续运行,但是,他们在使用你的应用程序时,并不希望每次都要处理这个对话框。因此,在程序里对响应性
能的设计很重要,这样,系统不会显示ANR给用户。

一般说来,如果应用程序不能响应用户输入的话,系统会显示一个ANR。例如,一个应用程序阻塞在一些I/O操作上(通常是网络访问),这时,应用程
序的主线程就不能再处理用户的输入事件。经过一定的时间后,系统认为应用程序已经挂起,并显示ANR来让用户选择杀死应用程序。

相似地,如果你的应用程序花费太多的时间来构建详细的内存结构,或者也许是在游戏里花费太多时间来计算下一步移动,这时,系统会认为你的应用程序已经挂起。因此,确保这些计算是高效的往往很重要,但即使是最高效的代码仍然需要花费时间来运行。

在这两种情况下,解决的方法通常是创建一个子线程,然后在线程里做你的大部分工作。这能让主线程(驱动UI事件循环)保持运行,并阻止系统认为你的
代码已经冻结。因为这些线程通常是在类级别上完成的,因此,你可以认为响应性能问题是一个类的问题。(与基本性能相比而言,基本性能问题认为是方法级别的
问题)

这篇文章将讨论Android系统如何判断一个应用程序处于无响应状态,并为保证应用程序的响应性提供向导。

这篇文章囊括这些主题:

  • 什么引发了ANR?
  • 如何避免ANR?
  • 增强响应灵敏性

1) 什么引发了 ANR ?

在Android里,应用程序的响应性是由Activity Manager和Window Manager系统服务监视的。当它监测到以下情况中的一个时,Android就会针对特定的应用程序显示ANR:

  • 在5秒内没有响应输入的事件(例如,按键按下,屏幕触摸)
  • BroadcastReceiver在10秒内没有执行完毕

一个ANR对话框显示给用户

2) 如何避免 ANR ?

考虑上面的ANR定义,让我们来研究一下为什么它会在Android应用程序里发生和如何最佳构建应用程序来避免ANR。

Android应用程序通常是运行在一个单独的线程(例如,main)里。这意味着你的应用程序所做的事情如果在主线程里占用了太长的时间的话,就会引发ANR对话框,因为你的应用程序并没有给自己机会来处理输入事件或者Intent广播。

因此,运行在主线程里的任何方法都尽可能少做事情。特别是,Activity应该在它的关键生命周期方法(如onCreate()和
onResume())里尽可能少的去做创建操作。潜在的耗时操作,例如网络或数据库操作,或者高耗时的计算如改变位图尺寸,应该在子线程里(或者以数据
库操作为例,通过异步请求的方式)来完成。然而,不是说你的主线程阻塞在那里等待子线程的完成------也不是调用Thread.wait()或是
Thread.sleep()。替代的方法是,主线程应该为子线程提供一个Handler,以便完成时能够提交给主线程。以这种方式设计你的应用程序,将

能保证你的主线程保持对输入的响应性并能避免由于5秒输入事件的超时引发的ANR对话框。这种做法应该在其它显示UI的线程里效仿,因为它们都受相同的超
时影响。

IntentReceiver执行时间的特殊限制意味着它应该做:在后台里做小的、琐碎的工作如保存设定或者注册一个Notification。和
在主线程里调用的其它方法一样,应用程序应该避免在BroadcastReceiver里做耗时的操作或计算。但不再是在子线程里做这些任务(因为
BroadcastReceiver的生命周期短),替代的是,如果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个
Service。顺便提及一句,你也应该避免在Intent
Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。如果你的应用程序在响应Intent广
播时需要向用户展示什么,你应该使用Notification Manager来实现。

3) 增强响应灵敏性

一般来说,在应用程序里,100到200ms是用户能感知阻滞的时间阈值。因此,这里有一些额外的技巧来避免ANR,并有助于让你的应用程序看起来有响应性。

  • 如果你的应用程序为响应用户输入正在后台工作的话,可以显示工作的进度(ProgressBar和ProgressDialog对这种情况来说很有用)。
  • 特别是游戏,在子线程里做移动的计算。
  • 如果你的应用程序有一个耗时的初始化过程的话,考虑可以显示一个Splash Screen或者快速显示主画面并异步来填充这些信息。在这两种情况下,你都应该显示正在进行的进度,以免用户认为应用程序被冻结了。

死锁 android ANR的更多相关文章

  1. Android ANR的产生与分析

      ANR即Application Not Responding应用无响应,一般在ANR的时候会弹出一个应用无响应对话框.也许有些开发者在使用某些手机开发中不在弹出应用无响应弹出框,特别是国产手机An ...

  2. Android ANR原理分析

    一.概述 ANR(Application Not responding),是指应用程序未响应,Android系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间能未能得到有效响应或者响应时间过 ...

  3. android ANR

    下面有两篇关于Android ANR的文章,感觉不错,分享一下! [Android实例] [Sundy系列]网上绝无仅有的Log分析教程及例子!android ANRhttp://blog.csdn. ...

  4. Android ANR、Force Closed(转)

    ANRs (“Application Not Responding”),意思是”应用没有响应“. 在如下情况下,Android会报出ANR错误: – 主线程 (“事件处理线程” / “UI线程”) 在 ...

  5. 理解Android ANR的触发原理(转)

    一.概述 ANR(Application Not responding),是指应用程序未响应,Android系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间能未能得到有效响应或者响应时间过 ...

  6. Android ANR从原理到日志分析,记下来就够了

    站在巨人的肩膀上可以看的更远 做一个优秀的搬运工 Android 彻底理解安卓应用无响应机制 Android ANR日志分析全面解析 优秀的文章不可独享,要扩散,要做好笔记,哈 <沁园春长沙&g ...

  7. Android ANR优化 2

    在实际情况中,当Android项目的用户量特别大时候,一些细小的问题也会被放大,ANR问题就是一个典型的例子. 一些ANR问题只会发生在用户实际使用的情景,当系统资源比较紧张等一些特殊情况下才会遇到, ...

  8. 教你如何 分析 Android ANR 问题

    ANR介绍 ANR 的全称是 Application No Responding,即应用程序无响应,具体是一些特定的 Message (Key Dispatch.Broadcast.Service) ...

  9. Android ANR 分析解决方法

    一:什么是ANR ANR:Application Not Responding,即应用无响应 二:ANR的类型 ANR一般有三种类型: 1. KeyDispatchTimeout(5 seconds) ...

随机推荐

  1. Windows Azure 即将更名

     今天我们宣布自2014 年4 月3 日起,WindowsAzure 将更名为Microsoft Azure.这一更名反映了Microsoft 的战略,并显示了Microsoft 专注于将Azur ...

  2. Scrambled Polygon(凸多边形,斜率)

    Scrambled Polygon Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 7805   Accepted: 3712 ...

  3. The document "ViewController.xib" could not be opened. Could not read archive.

    The document "ViewController.xib" could not be opened. Could not read archive. Please use ...

  4. FZU Problem 2169 shadow

    http://acm.fzu.edu.cn/problem.php?pid=2169 题目大意: S王国有N个城市,有N-1条道路.王都为编号1的城市.叛军驻扎在很多城市.除了王都外有K个城市有军队, ...

  5. 小编辑 Java 中十进制和十六进制的相互转换

    1 2 3 4 5 // 十进制转化为十六进制,结果为C8. Integer.toHexString(200);   // 十六进制转化为十进制,结果140. Integer.parseInt(&qu ...

  6. Tomcat7.0.22在Windows下详细配置过程

    Tomcat7.0.22在Windows下详细配置过程 一.JDK1.7安装 1.下载jdk,下载地址:http://www.oracle.com/technetwork/java/javase/do ...

  7. hadoop的集群安装

    hadoop的集群安装 1.安装JDK,解压jar,配置环境变量 1.1.解压jar tar -zxvf jdk-7u79-linux-x64.tar.gz -C /opt/install //将jd ...

  8. Java中 hashCode()方法详解

    先来看下Object源码里hashcode方法: /**     * Returns a hash code value for the object. This method is      * s ...

  9. 挺有意思的HBase日志+Splunk

    如题,转载自: http://hi.baidu.com/harry_lime/item/10cf2c174853c7ea39cb3042 如何模拟拔盘操作 Linux has a nifty way ...

  10. prim模板

    ]; int n; ][]; ]; int prim(){ int i,j,mi,v; ;i<n;i++){ d[i]=map[][i]; vis[i]=; } ;i<=n;i++){ m ...