ANR调试过程分析

本文详细介绍了ANR(Application Not Responding)的三种类型:Key Dispatching timeout、Broadcast timeout和服务执行超时,并分析了导致ANR的原因,如主线程阻塞、广播接收超时、服务执行超时。针对这些问题,提出了使用独立线程、Handler等解决方案,同时分享了ANR调试的标准步骤,包括查看logcat、分析堆栈信息和定位真实原因。文章列举了几个具体的ANR案例,如AsyncTask中的ContentResolver操作、网络数据读写阻塞UI线程以及内存泄漏导致的ANR问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 anr 类型

ANR: Application Not Responding

Include 3 types:

1.1 Key Dispatching timeout ANR5s)

The input event dont responding in specified time which is defined in ActivityManagerService.java such as 5 second and then ANR happened. At this time the main thread must been blocked, maybe it try to do a network access such as check update or send http request in ui thread, or do database operation or do some work like image convert.

How to solve the problem? Maybe you need a dependent thread to do these time consuming work or use handler to do connection work between UI thread and other threads. And avoided the use sleep(), wait() api or synchronized methods in main thread.

1.2 Broadcast timeout ANR10s)

The main thread cant execute the OnReceive function on specified time such as 10s for foreground application and 20s for background application.

1.3 Service execution timeout ANR(20s)

In this case, the anr happened means that the main thread cant execute the OnCreate or On StartCommand of Service finish in 20s

 

2 Main thread

include:

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

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

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

4.) other

3 Debug SOP

I always follow the steps to debug ANR issue.

1) get the lagcat information and focus on the log that 10 seconds before ANR was happened.

2) Analysis the call stack from trace.txt

3) Get the real reason of ANR, such as iowait?Block?Memoryleak?

4) Review the relative code

 

4 ANR Case

4.1 Case 1:

ContentResolver in AsyncTask onPostExecute, high iowait

Do database operation

Process:com.android.email

    Activity:com.android.email/.activity.MessageView

    Subject:keyDispatchingTimedOut

    CPU usage from 2550ms to -2814ms ago:

    5%187/system_server: 3.5% user + 1.4% kernel / faults: 86 minor 20major

    4.4% 1134/com.android.email: 0.7% user + 3.7% kernel /faults: 38 minor 19 major

    4% 372/com.android.eventstream: 0.7%user + 3.3% kernel / faults: 6 minor

    1.1% 272/com.android.phone:0.9% user + 0.1% kernel / faults: 33 minor

    0.9%252/com.android.systemui: 0.9% user + 0% kernel

    0%409/com.android.eventstream.telephonyplugin: 0% user + 0% kernel /faults: 2 minor

    0.1% 632/com.android.devicemonitor: 0.1% user + 0%kernel

    100%TOTAL: 6.9% user + 8.2% kernel +84%iowait

 

    -----pid 1134 at 2010-12-17 17:46:51 -----

    Cmd line:com.android.email

 

    DALVIK THREADS:

    (mutexes: tll=0 tsl=0tscl=0 ghl=0 hwl=0 hwll=0)

    "main" prio=5 tid=1 WAIT

    |group="main" sCount=1 dsCount=0 obj=0x2aaca180self=0xcf20

    | sysTid=1134 nice=0 sched=0/0 cgrp=[fopen-error:2]handle=1876218976

    at java.lang.Object.wait(Native Method)

    -waiting on <0x2aaca218> (a java.lang.VMThread)

    atjava.lang.Thread.parkFor(Thread.java:1424)

    atjava.lang.LangAccessImpl.parkFor(LangAccessImpl.java:48)

    atsun.misc.Unsafe.park(Unsafe.java:337)

    atjava.util.concurrent.locks.LockSupport.park(LockSupport.java:157)

    atjava.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:808)

    atjava.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:841)

    atjava.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1171)

    atjava.util.concurrent.locks.ReentrantLock$FairSync.lock(ReentrantLock.java:200)

    atjava.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:261)

    atandroid.database.sqlite.SQLiteDatabase.lock(SQLiteDatabase.java:378)

    atandroid.database.sqlite.SQLiteCursor.<init>(SQLiteCursor.java:222)

    atandroid.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:53)

    atandroid.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1356)

    atandroid.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1235)

    atandroid.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1189)

    atandroid.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1271)

    atcom.android.email.provider.EmailProvider.query(EmailProvider.java:1098)

    atandroid.content.ContentProvider$Transport.query(ContentProvider.java:187)

    atandroid.content.ContentResolver.query(ContentResolver.java:268)

    atcom.android.email.provider.EmailContent$Message.restoreMessageWithId(EmailContent.java:648)

    atcom.android.email.Controller.setMessageRead(Controller.java:658)

    atcom.android.email.activity.MessageView.onMarkAsRead(MessageView.java:700)

    atcom.android.email.activity.MessageView.access$2500(MessageView.java:98)

    atcom.android.email.activity.MessageView$LoadBodyTask.onPostExecute(MessageView.java:1290)

    atcom.android.email.activity.MessageView$LoadBodyTask.onPostExecute(MessageView.java:1255)

    atandroid.os.AsyncTask.finish(AsyncTask.java:417)

    atandroid.os.AsyncTask.access$300(AsyncTask.java:127)

    atandroid.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)

    atandroid.os.Handler.dispatchMessage(Handler.java:99)

    atandroid.os.Looper.loop(Looper.java:123)

    atandroid.app.ActivityThread.main(ActivityThread.java:3652)

    atjava.lang.reflect.Method.invokeNative(Native Method)

    atjava.lang.reflect.Method.invoke(Method.java:507)

    atcom.android.internal.os.ZygoteIn

 

 

 

4.2 Case 2

 R/W internet data block the ui thread

Set timeout or move the network operate to a new thread

ANRin process: com.android.mediascape:PhotoViewer (last incom.android.mediascape:PhotoViewer)

    Annotation:keyDispatchingTimedOut

    CPU usage:

    Load: 6.74 / 6.89 / 6.12

    CPUusage from 8254ms to 3224ms ago:

    ovider.webmedia: 4% = 4% user +0% kernel / faults: 68 minor

    system_server: 2% = 1% user + 0%kernel / faults: 18 minor

    re-initialized>: 0% = 0% user + 0%kernel / faults: 50 minor

    events/0: 0% = 0% user + 0%kernel

    TOTAL:7% = 6% user + 1% kernel

 

    DALVIKTHREADS:

    ""main"" prio=5 tid=3 NATIVE

    |group=""main"" sCount=1 dsCount=0 s=Yobj=0x4001b240 self=0xbda8

    | sysTid=2579 nice=0 sched=0/0cgrp=unknown handle=-1343993184

    atorg.apache.harmony.luni.platform.OSNetworkSystem.receiveStreamImpl(NativeMethod)

    atorg.apache.harmony.luni.platform.OSNetworkSystem.receiveStream(OSNetworkSystem.java:478)

    atorg.apache.harmony.luni.net.PlainSocketImpl.read(PlainSocketImpl.java:565)

    atorg.apache.harmony.luni.net.SocketInputStream.read(SocketInputStream.java:87)

    atorg.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection$LimitedInputStream.read(HttpURLConnection.java:303)

    atjava.io.InputStream.read(InputStream.java:133)

    atjava.io.BufferedInputStream.fillbuf(BufferedInputStream.java:157)

    atjava.io.BufferedInputStream.read(BufferedInputStream.java:346)

    atandroid.graphics.BitmapFactory.nativeDecodeStream(Native Method)

    atandroid.graphics.BitmapFactory.decodeStream(BitmapFactory.java:459)

    atcom.android.mediascape.activity.PhotoViewerActivity.getPreviewImage(PhotoViewerActivity.java:4465)

    atcom.android.mediascape.activity.PhotoViewerActivity.dispPreview(PhotoViewerActivity.java:4406)

    atcom.android.mediascape.activity.PhotoViewerActivity.access$6500(PhotoViewerActivity.java:125)

    atcom.android.mediascape.activity.PhotoViewerActivity$33$1.run(PhotoViewerActivity.java:4558)

    atandroid.os.Handler.handleCallback(Handler.java:587)

    atandroid.os.Handler.dispatchMessage(Handler.java:92)

    atandroid.os.Looper.loop(Looper.java:123)

    atandroid.app.ActivityThread.main(ActivityThread.java:4370)

    atjava.lang.reflect.Method.invokeNative(Native Method)

    atjava.lang.reflect.Method.invoke(Method.java:521)

    atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)

    atcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)

    atdalvik.system.NativeStart.main(Native Method)

 

4.3 Case 3 

Memeryleak: createbitmap that case the gc happened and then ANR

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值