安卓 - 我应该如何调查 ANR 问题?

181

有没有办法找出我的应用程序触发了ANR(应用程序无响应)的位置。我查看了/data目录下的traces.txt文件,发现了我的应用程序的跟踪信息。以下是跟踪信息的内容:

DALVIK THREADS:
"main" prio=5 tid=3 TIMED_WAIT
  | group="main" sCount=1 dsCount=0 s=0 obj=0x400143a8
  | sysTid=691 nice=0 sched=0/0 handle=-1091117924
  at java.lang.Object.wait(Native Method)
  - waiting on <0x1cd570> (a android.os.MessageQueue)
  at java.lang.Object.wait(Object.java:195)
  at android.os.MessageQueue.next(MessageQueue.java:144)
  at android.os.Looper.loop(Looper.java:110)
  at android.app.ActivityThread.main(ActivityThread.java:3742)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:515)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:497)
  at dalvik.system.NativeStart.main(Native Method)

"Binder Thread #3" prio=5 tid=15 NATIVE
  | group="main" sCount=1 dsCount=0 s=0 obj=0x434e7758
  | sysTid=734 nice=0 sched=0/0 handle=1733632
  at dalvik.system.NativeStart.run(Native Method)

"Binder Thread #2" prio=5 tid=13 NATIVE
  | group="main" sCount=1 dsCount=0 s=0 obj=0x433af808
  | sysTid=696 nice=0 sched=0/0 handle=1369840
  at dalvik.system.NativeStart.run(Native Method)

"Binder Thread #1" prio=5 tid=11 NATIVE
  | group="main" sCount=1 dsCount=0 s=0 obj=0x433aca10
  | sysTid=695 nice=0 sched=0/0 handle=1367448
  at dalvik.system.NativeStart.run(Native Method)

"JDWP" daemon prio=5 tid=9 VMWAIT
  | group="system" sCount=1 dsCount=0 s=0 obj=0x433ac2a0
  | sysTid=694 nice=0 sched=0/0 handle=1367136
  at dalvik.system.NativeStart.run(Native Method)

"Signal Catcher" daemon prio=5 tid=7 RUNNABLE
  | group="system" sCount=0 dsCount=0 s=0 obj=0x433ac1e8
  | sysTid=693 nice=0 sched=0/0 handle=1366712
  at dalvik.system.NativeStart.run(Native Method)

"HeapWorker" daemon prio=5 tid=5 VMWAIT
  | group="system" sCount=1 dsCount=0 s=0 obj=0x4253ef88
  | sysTid=692 nice=0 sched=0/0 handle=1366472
  at dalvik.system.NativeStart.run(Native Method)

----- end 691 -----

我该如何找出问题的所在?跟踪中的方法都是SDK方法。


3
我有一个类似的报告,也发生在android.os.MessageQueue.nativePollOnce(Native Method)。我能安全地忽略它吗? - rds
13个回答

0

我的ANR问题,经过很多工作,我发现一个线程调用了布局中不存在的资源,但没有返回异常,而是出现了ANR...


那真是非常奇怪的。 - Nilabja

0

对于已发布的应用程序,Google Play控制台本身会显示精确的ANR报告,就像崩溃报告一样。它将向您展示所有信息,包括哪个类或线程导致了ANR、发生次数以及所有其他细节。

您的应用程序仪表板 -> 探索Android Vitals选项卡 -> 查看核心Vitals详细信息(ANR部分) -> 选择您的apk或artifect版本 -> 崩溃和ANR页面只需从下拉菜单中选择ANRs即可。它将列出所有的ANRs。

您可以导航到特定的ANR并检查详细信息。


0
在寻找解决 Android 上 ANR 崩溃的多种方案后,我偶然发现了这个链接:

https://developer.android.com/studio/debug/bug-report

  1. 使用已安装ADB的计算机将您的Android设备连接

  2. 打开终端

  3. 运行以下命令(将“path”替换为您想要保存zip文件的位置,例如~/folder/report):

    adb bugreport

这使我能够访问所有ANR(anr*文件)错误报告,并在以下文件夹中提供完整的跟踪信息:

FS -> data -> anr -> anr*文件


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接