Android ANR分析

作者: 努力深耕Android的小透明 | 来源:发表于2018-04-12 16:58 被阅读284次

1) ANR一般有三种类型:

1:KeyDispatchTimeout(5 seconds) --主要类型

按键或触摸事件在特定时间内无响应

2:BroadcastTimeout(10 seconds)

BroadcastReceiver在特定时间内无法处理完成

3:ServiceTimeout(20 seconds) --小概率类型

Service在特定的时间内无法处理完成

2) KeyDispatchTimeout

按键或者触摸事件在规定时间内没有响应。具体的超时时间的定义在framework下的ActivityManagerService.java

3) 超时原因:

超时的计数一般从按键分发给app开始。

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

(2)当前的事件正在处理,但没有及时完成

4)如何避免KeyDispatchTimeout

1:UI线程尽量只做跟UI相关的工作

2:耗时的工作(比如数据库操作,I/O,连接网络或者别的有可能阻碍UI线程的操作)把它放入单独的线程处理

3:尽量用Handler来处理UIthread和别的thread之间的交互

5) UI线程

哪些属于UI线程呢?

UI线程主要包括如下:

Activity:onCreate(), onResume(), onDestroy(), onKeyDown(), onClick(),etc

AsyncTask: onPreExecute(), onProgressUpdate(), onPostExecute(), onCancel,etc

Mainthread handler: handleMessage(), post*(runnable r), etc

other

6) 分析ANR

如果CPU使用率很高,可能是当前app获取不到CPU使用权导致的饥饿现象或者在大量计算死锁了。

如果CPU使用率低,主线程BLOCK了

IOwait很高,说明ANR很可能是IO导致的。

这是通过logcat分析出来的

7) 快速解决小技巧

1.以项目的包名中的关键字进行搜索

2.搜索可能导致ANR的的关键字:block,iowait,

8) JAVA中的线程的状态

public enum State { /** * The thread has been created, but has never been started. */ NEW, /** * The thread may be run. */ RUNNABLE, /** * The thread is blocked and waiting for a lock. */ BLOCKED, /** * The thread is waiting. */ WAITING, /** * The thread is waiting for a specified amount of time. */ TIMED_WAITING, /** * The thread has been terminated. */ TERMINATED }

9) C代码中定义的线程的状态

// /art/runtime/thread_state.h

enum ThreadState {

  //                                  Thread.State  JDWP state

  kTerminated = 66,                // TERMINATED    TS_ZOMBIE    Thread.run has returned, but Thread* still around

  kRunnable,                        // RUNNABLE      TS_RUNNING  runnable

  kTimedWaiting,                    // TIMED_WAITING  TS_WAIT      in Object.wait() with a timeout

  kSleeping,                        // TIMED_WAITING  TS_SLEEPING  in Thread.sleep()

  kBlocked,                        // BLOCKED        TS_MONITOR  blocked on a monitor

  kWaiting,                        // WAITING        TS_WAIT      in Object.wait()

  kWaitingForGcToComplete,          // WAITING        TS_WAIT      blocked waiting for GC

  kWaitingForCheckPointsToRun,      // WAITING        TS_WAIT      GC waiting for checkpoints to run

  kWaitingPerformingGc,            // WAITING        TS_WAIT      performing GC

  kWaitingForDebuggerSend,          // WAITING        TS_WAIT      blocked waiting for events to be sent

  kWaitingForDebuggerToAttach,      // WAITING        TS_WAIT      blocked waiting for debugger to attach

  kWaitingInMainDebuggerLoop,      // WAITING        TS_WAIT      blocking/reading/processing debugger events

  kWaitingForDebuggerSuspension,    // WAITING        TS_WAIT      waiting for debugger suspend all

  kWaitingForJniOnLoad,            // WAITING        TS_WAIT      waiting for execution of dlopen and JNI on load code

  kWaitingForSignalCatcherOutput,  // WAITING        TS_WAIT      waiting for signal catcher IO to complete

  kWaitingInMainSignalCatcherLoop,  // WAITING        TS_WAIT      blocking/reading/processing signals

  kWaitingForDeoptimization,        // WAITING        TS_WAIT      waiting for deoptimization suspend all

  kWaitingForMethodTracingStart,    // WAITING        TS_WAIT      waiting for method tracing to start

  kWaitingForVisitObjects,          // WAITING        TS_WAIT      waiting for visiting objects

  kWaitingForGetObjectsAllocated,  // WAITING        TS_WAIT      waiting for getting the number of allocated objects

  kStarting,                        // NEW            TS_WAIT      native thread started, not yet ready to run managed code

  kNative,                          // RUNNABLE      TS_RUNNING  running in a JNI native method

  kSuspended,                      // RUNNABLE      TS_RUNNING  suspended by GC or debugger

};

两者可以看出在C代码中定义更为详细,Traces中显示的线程状态都是C代码定义的.我们可以通过查看线程状态对应的信息分析ANR问题.

相关文章

  • 高通平台LOG目录分析

    高通平台日志目录分析 anr: android(system)日志中搜索“ANR in”关键字, 可以得到信息1、...

  • ANR(1)---理解Android ANR的信息收集过程

    移步ANR系列基于Android 6.0源码, 分析当发生ANR时系统的处理过程 一 ANR场景 无论是四大组件或...

  • ANR系列

    ANR(0)---理解Android ANR的触发原理ANR(1)---理解Android ANR的信息收集过程A...

  • Android ANR分析

    1) ANR一般有三种类型: 1:KeyDispatchTimeout(5 seconds) --主要类型 按键或...

  • Android ANR 分析

    Application Not Responding 1. 产生的原因 主线程任务执行时间过长(阻塞), 系统消息...

  • Android ANR分析

    什么是ANR ANR(Application Not Responding)就是应用在规定的时间内没有响应用户输入...

  • Android ANR分析

    ANR基础知识 ANR全称Application not response,即程序无响应。 ANR的分类 KeyD...

  • Android ANR分析

    [toc] ANR分析 ANR触发场景 在android系统中,特定的操作需要在一定时间内完成,超过限定的时间就会...

  • 记录一次ANR的分析过程

    Android开发中难免碰到ANR问题,但是网上关于ANR的文章并不多,那我就写一篇最近工作中碰到ANR的分析过程...

  • Android ANR(二)-触发原理

    接之前的文章:Android ANR问题(一)-基本分析方法,这篇文章总结一下ANR触发原理。 一、Service...

网友评论

    本文标题:Android ANR分析

    本文链接:https://www.haomeiwen.com/subject/bdlfkftx.html