我试图找出在某些情况下我的应用程序中 UI 线程卡住的原因。
我已经通过 DDMS 分析运行了该应用程序。但是在底部的树 TableView 中,我看到了所有线程上调用的所有方法,而我只想关注主线程。
有没有办法过滤 DDMS 中底部的树形表方法列表,以仅包含所选线程(在我的例子中是 UI 线程)的统计信息?
一个子问题:是否有一些好的 Android 分析器?
最佳答案
UI 没有提供执行此操作的方法——您只需浏览时间轴并单击看起来很忙的部分。
有一种粗略的方法可以满足您的需求。
SDK 包含一个名为 dmtracedump
的工具,可用于从 .trace
文件生成报告。当您使用 DDMS 抓取跟踪时,记下文件的位置(我的位置是 /tmp/ddms4176182990461128308.trace
)。在 Linux 上,您将运行:
dmtracedump -o <filename> > trace.txt
这将为您提供一个如下所示的文件:
VERSION: 3
Threads (13):
1 main
2 GC
3 Signal Catcher
4 JDWP
...
Trace (threadID action usecs class.method signature):
4 xit 0 ..dalvik/system/VMDebug.startMethodTracingDdms (IIZI)V
4 xit 0 .android/os/Debug.startMethodTracingDdms (IIZI)V
4 xit 0 android/ddm/DdmHandleProfiling.handleMPSS (Lorg/apache/harmony/dalvik/ddmc/Chunk;)Lorg/apache/harmony/dalvik/ddmc/Chunk;
...
如输出中所述,每一行都以与顶部表格对应的线程 ID 开头(因此线程 ID 4 是处理 DDMS 流量的 JDWP 线程)。后面跟着一个操作代码:ent
表示方法进入,xit
表示方法退出,或者 unr
表示由于异常而展开的堆栈。之后是每个线程的 CPU 时间戳(即该线程使用的累计 CPU 时间),然后是方法名称和签名。
如果您只想查看主 UI 线程(线程 ID 1),您可以使用:
grep "^ 1 " trace.txt
现在只需解析输出即可。 :-)
如果您可以从跟踪文件中去除不感兴趣的线程的数据,那么处理起来会更容易,然后只需使用 traceview
工具(包含在 SDK 中)打开新文件。如果您打开一个 .trace 文件,您可以看到它是一大块文本,后面跟着一大块二进制数据。您将需要编写一个程序来传递文本,然后解析二进制部分并丢弃任何线程 ID 与您感兴趣的线程 ID 不同的内容。格式很简单——一组固定大小的记录——在 profiling code 顶部附近的评论中描述.
(不知道有没有人写过。)
关于java - Android - 通过 DDMS 分析特定线程(UI 线程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22935464/