Android ANR分析

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问题.

    原文作者:努力深耕Android的小透明
    原文地址: https://www.jianshu.com/p/8fe48e7908a3
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞