如何避免KeyDispatchTimeout
1:UI线程尽量只做跟UI相关的工作
2:耗时的工作(比如数据库操作,I/O,连接网络或者别的有可能阻碍UI线程的操作)把它放入单独的线程处理
3:尽量用Handler来处理UIthread和别的thread之间的交互

如何去分析ANR

DALVIK THREADS (22):
"main" prio=5 tid=1 Native
| group="main" sCount=1 dsCount=0 obj=0x74729000 self=0xf4827800
| sysTid=29242 nice=0 cgrp=default sched=0/0 handle=0xf7779bec
| state=D schedstat=( 1168866313 28837852 971 ) utm=90 stm=26 core=5 HZ=100
| stack=0xff5f3000-0xff5f5000 stackSize=8MB
| held mutexes=
kernel: (couldn't read /proc/self/task/29242/stack)
native: (backtrace::Unwind failed for thread 29242)
at libcore.io.Posix.fsync(Native method)
at libcore.io.BlockGuardOs.fsync(BlockGuardOs.java:143)
at java.io.FileDescriptor.sync(FileDescriptor.java:74)
at android.os.FileUtils.sync(FileUtils.java:152)
at android.app.SharedPreferencesImpl.writeToFile(SharedPreferencesImpl.java:598)
at android.app.SharedPreferencesImpl.access$800(SharedPreferencesImpl.java:51)
at android.app.SharedPreferencesImpl$2.run(SharedPreferencesImpl.java:512)
- locked <@addr=0x32c014d0> (a java.lang.Object)
at android.app.SharedPreferencesImpl.enqueueDiskWrite(SharedPreferencesImpl.java:533)
at android.app.SharedPreferencesImpl.access$100(SharedPreferencesImpl.java:51)
at android.app.SharedPreferencesImpl$EditorImpl.commit(SharedPreferencesImpl.java:455)
at com.zhangyue.iReader.DB.SPHelper.setString(SourceFile:56)
- locked <@addr=0x32c01810> (a com.zhangyue.iReader.DB.SPHelper)
at com.zhangyue.iReader.account.a.a(SourceFile:533)
at com.zhangyue.iReader.account.a.b(SourceFile:526)
at com.zhangyue.iReader.account.a.a(SourceFile:215)
at com.zhangyue.iReader.app.APP.initAPP(SourceFile:681)
at com.zhangyue.iReader.app.APP.initAPPData(SourceFile:731)
at com.zhangyue.iReader.app.IreaderApplication.onCreate(SourceFile:53)
at com.ireader.plug.utils.a.a(unavailable:-1)
at com.ireader.plug.api.IreaderPlugApi.initPlugin(unavailable:-1)
at com.android.browser.Browser.onCreate(SourceFile:77)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1024)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5084)
at android.app.ActivityThread.access$1600(ActivityThread.java:187)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1646)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5871)
at java.lang.reflect.Method.invoke!(Native method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1119)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:885) "Heap thread pool worker thread 0" prio=5 tid=2 Native (still starting up)
| group="" sCount=1 dsCount=0 obj=0x0 self=0xeec4d400
| sysTid=29250 nice=0 cgrp=default sched=0/0 handle=0xf5078000
| state=S schedstat=( 616307 0 18 ) utm=0 stm=0 core=7 HZ=100
| stack=0xf4390000-0xf4392000 stackSize=1020KB
| held mutexes=
kernel: (couldn't read /proc/self/task/29250/stack)
native: #00 pc 000134a4 /system/lib/libc.so (syscall+28)
native: #01 pc 000a9b27 /system/lib/libart.so (art::ConditionVariable::Wait(art::Thread*)+74)
native: #02 pc 00237b0f /system/lib/libart.so (art::ThreadPool::GetTask(art::Thread*)+50)
native: #03 pc 00237ab9 /system/lib/libart.so (art::ThreadPoolWorker::Run()+52)
native: #04 pc 002382e1 /system/lib/libart.so (art::ThreadPoolWorker::Callback(void*)+52)
native: #05 pc 00016f97 /system/lib/libc.so (__pthread_start(void*)+30)
native: #06 pc 00014f9f /system/lib/libc.so (__start_thread+6)
(no managed stack frames)

拿到一个日志文件,要分成多段来看 。 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) ------

格式如下:

------ MEMORY INFO (/proc/meminfo) ------

MemTotal: 347076 kB

MemFree: 56408 kB

Buffers: 7192 kB

Cached: 104064 kB

SwapCached: 0 kB

Active: 192592 kB

Inactive: 40548 kB

Active(anon): 129040 kB

Inactive(anon): 1104 kB

Active(file): 63552 kB

Inactive(file): 39444 kB

Unevictable: 7112 kB

Mlocked: 0 kB

SwapTotal: 0 kB

SwapFree: 0 kB

Dirty: 44 kB

Writeback: 0 kB

AnonPages: 129028 kB

Mapped: 73728 kB

Shmem: 1148 kB

Slab: 13072 kB

SReclaimable: 4564 kB

SUnreclaim: 8508 kB

KernelStack: 3472 kB

PageTables: 12172 kB

NFS_Unstable: 0 kB

Bounce: 0 kB

WritebackTmp: 0 kB

CommitLimit: 173536 kB

Committed_AS: 7394524 kB

VmallocTotal: 319488 kB

VmallocUsed: 90752 kB

VmallocChunk: 181252 kB

2,时间信息 , 也是我们主要分析的信息 。

------ VMALLOC INFO (/proc/vmallocinfo) ------

------ EVENT INFO (/proc/vmallocinfo) ------

格式如下:

------ SYSTEM LOG (logcat -b system -v time -d *:v) ------

01-15 16:41:43.671 W/PackageManager( 2466): Unknown permission com.wsomacp.permission.PROVIDER in package com.android.mms

01-15 16:41:43.671 I/ActivityManager( 2466): Force stopping package com.android.mms uid=10092

01-15 16:41:43.675 I/UsageStats( 2466): Something wrong here, didn’t expect com.sec.android.app.twlauncher to be paused

01-15 16:41:44.108 I/ActivityManager( 2466): Start proc com.sec.android.widgetapp.infoalarm for service com.sec.android.widgetapp.infoalarm/.engine.DataService: pid=20634 uid=10005 gids={3003, 1015, 3002}

01-15 16:41:44.175 W/ActivityManager( 2466): Activity pause timeout for HistoryRecord{48589868 com.sec.android.app.twlauncher/.Launcher}

01-15 16:41:50.864 I/KeyInputQueue( 2466): Input event

01-15 16:41:50.866 D/KeyInputQueue( 2466): screenCaptureKeyFlag setting 0

01-15 16:41:50.882 I/PowerManagerService( 2466): Ulight 0->7|0

01-15 16:41:50.882 I/PowerManagerService( 2466): Setting target 2: cur=0.0 target=70 delta=4.6666665 nominalCurrentValue=0

01-15 16:41:50.882 I/PowerManagerService( 2466): Scheduling light animator!

01-15 16:41:51.706 D/PowerManagerService( 2466): enableLightSensor true

01-15 16:41:51.929 I/KeyInputQueue( 2466): Input event

01-15 16:41:51.933 W/WindowManager( 2466): No focus window, dropping: KeyEvent{action=0 code=26 repeat=0 meta=0 scancode=26 mFlags=9}

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) ------

格式如下 :
----- pid 21161 at 2011-01-15 16:49:01 -----
Cmd line: com.android.mms DALVIK THREADS:
"main" prio=5 tid=1 NATIVE
| group="main" sCount=1 dsCount=0 s=N obj=0x4001d8d0 self=0xccc8
| sysTid=21161 nice=0 sched=0/0 cgrp=default handle=-1345017808
| schedstat=( 4151552996 5342265329 10995 )
at android.media.MediaPlayer._reset(Native Method)
at android.media.MediaPlayer.reset(MediaPlayer.java:1218)
at android.widget.VideoView.release(VideoView.java:499)
at android.widget.VideoView.access$2100(VideoView.java:50)
at android.widget.VideoView$6.surfaceDestroyed(VideoView.java:489)
at android.view.SurfaceView.reportSurfaceDestroyed(SurfaceView.java:572)
at android.view.SurfaceView.updateWindow(SurfaceView.java:476)
at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:206)
at android.view.View.dispatchDetachedFromWindow(View.java:6082)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1156)
at android.view.ViewGroup.removeAllViewsInLayout(ViewGroup.java:2296)
at android.view.ViewGroup.removeAllViews(ViewGroup.java:2254)
at com.android.mms.ui.SlideView.reset(SlideView.java:687)
at com.android.mms.ui.SlideshowPresenter.presentSlide(SlideshowPresenter.java:189)
at com.android.mms.ui.SlideshowPresenter$3.run(SlideshowPresenter.java:531)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
at dalvik.system.NativeStart.main(Native Method)

我总结了观察log文件的基本步骤 。

1,如果是ANR问题 , 则搜索“ANR ”关键词 。 快速定位到关键事件信息 。

2,如果是ForceClosed 和其它异常退出信息,则搜索"Fatal" 关键词, 快速定位到关键事件信息 。如果是crash,则搜索CRASH.

3,定位到关键事件信息后 , 如果信息不够明确的,再去搜索应用程序包的虚拟机信息 ,查看具体的进程和线程跟踪的日志,来定位到代码 。 搜索 DALVIK THREADS ,查看tid=1的进程的情况

4, 搜索你的包名,进程名等。

用这种方法,出现问题,根本不需要断点调试 , 直接定位到问题,屡试不爽 。

下面,我们就开始来分析这个例子的log 。

打开log文件 , 由于是ANR错误,因此搜索"ANR " , 为何要加空格呢,你加上和去掉比较一下就知道了 。 可以屏蔽掉不少保存到anr.log文件的无效信息 。

参考:http://blog.csdn.net/dadoneo/article/details/8270107

Android ANR详解的更多相关文章

  1. Android ANR 详解

    ANR简介 ANR,是“Application Not Responding”的缩写,即“应用程序无响应”.在Android中,ActivityManagerService(简称AMS)和Window ...

  2. Android App优化之ANR详解

    引言 背景:Android App优化, 要怎么做? Android App优化之性能分析工具 Android App优化之提升你的App启动速度之理论基础 Android App优化之提升你的App ...

  3. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  4. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  5. Android ActionBar详解

    Android ActionBar详解 分类: Android2014-04-30 15:23 1094人阅读 评论(0) 收藏 举报 androidActionBar   目录(?)[+]   第4 ...

  6. Android 签名详解

    Android 签名详解 AndroidOPhoneAnt设计模式Eclipse  在Android 系统中,所有安装 到 系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程 ...

  7. Android编译系统详解(一)

    ++++++++++++++++++++++++++++++++++++++++++ 本文系本站原创,欢迎转载! 转载请注明出处: http://blog.csdn.net/mr_raptor/art ...

  8. Android布局详解之一:FrameLayout

      原创文章,如有转载,请注明出处:http://blog.csdn.net/yihui823/article/details/6702273 FrameLayout是最简单的布局了.所有放在布局里的 ...

  9. 【整理修订】Android.mk详解

    Android.mk详解 1. Android.mk 的应用范围 Android.mk文件是GNU Makefile的一小部分,它用来对Android程序进行编译. 一个Android.mk文件可以编 ...

随机推荐

  1. Oracle三种循环例题:打印九九乘法表

    数据库SQL三种循环语句(For.While.Loop) --如果要将执行结果输出,需要先执行 setserveroutput on 命令,在窗口里显示服务器输出信息 set serveroutput ...

  2. Sql_Server中如何判断表中某字段是否存在

    --比如说要判断表A中的字段C是否存在两个方法: 一, IF EXISTS ( SELECT 1 FROM SYSOBJECTS T1 INNER JOIN SYSCOLUMNS T2 ON T1.I ...

  3. Oracle VM VirtualBox 共享文件夹设置

    在Windows平台下,这货完全没有VMware好用,但在Linux平台就很好用. 学校机房的电脑打开虚拟机就不能插优盘,一插优盘就卡死,所以,只好用共享文件夹了. 1.在虚拟机外部新建一个文件夹 假 ...

  4. 屏蔽各类弹窗广告(WPS、智能云输入法)

    托盘中的广告“领取双11红包,最高1111元”的罪魁祸首是“智能云输入法” 广告在托盘中闪动: 结束SCSkinInst.exe后,托盘中的广告消失: 智能云输入法的安装路径可参考: C:\Progr ...

  5. April 13 2017 Week 15 Thursday

    Happiness takes no account of time. 幸福不觉光阴过. Do you know the theory of relativity? If you know about ...

  6. Jerry Wang诚邀广大SAP同仁免费加入我的知识星球,共同探讨SAP技术问题

    大家知道Jerry Wang有一个微信公众号"汪子熙",2017年12月27日,Jerry的这个公众号发布了第一篇文章.到今天2018年10月底为止,正好十个月. 在这10个月的时 ...

  7. Windows聚焦转为图片

    1.windows聚焦图片目录路径: C:\Users\Er\AppData\Local\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1 ...

  8. 广搜,智能拼图(ZOJ1079)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=79 解题报告: 思路简单,写法太难. #include <std ...

  9. 【转载】刘昕明:送给和我一样曾经浮躁过的PHP程序员

    刘昕明:送给和我一样曾经浮躁过的PHP程序员 来源:刘昕明博客 作者:刘昕明         2012年偶决定开始写博客了,不为别的,就希望可以通过博客记录我的成长历程同时也希望可以帮助一些刚毕业,刚 ...

  10. ES6的数组方法之Array.from

    首先说说什么是数组:数组在类型划分上归为Object,属于比较特殊的对象,数组的索引值类似于对象的key值. 数组的几个注意点: 1.数组的长度是可读属性,不可更改,数组的长度根据索引最大值. 2.数 ...