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

    相关文章

      网友评论

        本文标题:Android ANR分析

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