死锁 android ANR
以下为一段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的更多相关文章
- Android ANR的产生与分析
ANR即Application Not Responding应用无响应,一般在ANR的时候会弹出一个应用无响应对话框.也许有些开发者在使用某些手机开发中不在弹出应用无响应弹出框,特别是国产手机An ...
- Android ANR原理分析
一.概述 ANR(Application Not responding),是指应用程序未响应,Android系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间能未能得到有效响应或者响应时间过 ...
- android ANR
下面有两篇关于Android ANR的文章,感觉不错,分享一下! [Android实例] [Sundy系列]网上绝无仅有的Log分析教程及例子!android ANRhttp://blog.csdn. ...
- Android ANR、Force Closed(转)
ANRs (“Application Not Responding”),意思是”应用没有响应“. 在如下情况下,Android会报出ANR错误: – 主线程 (“事件处理线程” / “UI线程”) 在 ...
- 理解Android ANR的触发原理(转)
一.概述 ANR(Application Not responding),是指应用程序未响应,Android系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间能未能得到有效响应或者响应时间过 ...
- Android ANR从原理到日志分析,记下来就够了
站在巨人的肩膀上可以看的更远 做一个优秀的搬运工 Android 彻底理解安卓应用无响应机制 Android ANR日志分析全面解析 优秀的文章不可独享,要扩散,要做好笔记,哈 <沁园春长沙&g ...
- Android ANR优化 2
在实际情况中,当Android项目的用户量特别大时候,一些细小的问题也会被放大,ANR问题就是一个典型的例子. 一些ANR问题只会发生在用户实际使用的情景,当系统资源比较紧张等一些特殊情况下才会遇到, ...
- 教你如何 分析 Android ANR 问题
ANR介绍 ANR 的全称是 Application No Responding,即应用程序无响应,具体是一些特定的 Message (Key Dispatch.Broadcast.Service) ...
- Android ANR 分析解决方法
一:什么是ANR ANR:Application Not Responding,即应用无响应 二:ANR的类型 ANR一般有三种类型: 1. KeyDispatchTimeout(5 seconds) ...
随机推荐
- Qt控制台和带窗口的区别_mickelfeng_新浪博客
Qt控制台和带窗口的区别_mickelfeng_新浪博客 t控制台和带窗口的区别 (2012-04-30 10:50:53) 标签: 杂谈 分类: C/C ...
- 1148 - Mad Counting(数学)
1148 - Mad Counting PDF (English) Statistics Forum Time Limit: 0.5 second(s) Memory Limit: 32 MB M ...
- 信号量多-threaded同步Semaphore
Semaphore它是JDK1.5一个实现后,外面有个办法同步.Semaphore能够保持其当前的线程接入号码.并提供了一个同步机制. 采用Semaphore时,可以用相同的对资源的访问进行控制的线程 ...
- HDU 2665(Kth number-区间第k大[内存限制+重数])
Kth number Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- js 解析XML 在Edge浏览器下面 无法准确读到节点属性值
js 解析XML 在Edge浏览器下面 无法准确读到节点属性值 Dom.documentElement.childNodes[j].attributes[2] 这个是大众写法 在win10的edge ...
- 【node.js】本地模式安装express:'express' 不是内部或外部命令,也不是可运行的程序或批处理文件。
今天闲来无事想起了node.js,因此到网上下载了一个node.js的安装程序进行安装.其中: 安装程序:node-v0.11.13-x64.msi PC系统:Windows 7 自定义安装路径:D: ...
- Android 学习开发笔记《Android认识》
1. Android:2007年11月5日第一版,2009年5月豪华版,2010年HTC手机 2. Android框架主要:应用程序.应用程序框架.函数库.运行时. ...
- Python之路:迭代器和yield生成器
一.迭代器 对于Python 列表的 for 循环,他的内部原理:查看下一个元素是否存在,如果存在,则取出,如果不存在,则报异常 StopIteration.(python内部对异常已处理) 使用迭代 ...
- float与position
使用float会使块级元素的宽高表现为包裹内容(在不设定宽高的情况下) 这是当然的 我们使用float就是使几个div排在一行 当然不可能在宽度上撑满父元素啦 至于高度 不论有没有float 高 ...
- Vim中如何全选并复制?
全部删除:按esc后,然后dG全部复制:按esc后,然后ggyG 全选高亮显示:按esc后,然后ggvG(这个好像有点问题)或者ggVG正确 vim如何与剪贴板交互(将vim的内容复制出来) 习惯了在 ...