java - Android - 通过 DDMS 分析特定线程(UI 线程)

标签 java android multithreading profiling ddms


我试图找出在某些情况下我的应用程序中 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/

相关文章:

java - 集合列的 Hibernate 条件查询

android epub 图书馆,skyepub

java - 如何使用 SwingWorker 避免 GUI 卡住

java - Process Builder 不接受 ffmpeg 参数

java - 正则表达式匹配数字或不匹配任何内容

java - 有没有办法使用 Scanner 对象在文本文档中搜索特定数据?

android - 动态 ListView 保存状态

android - Kotlin:FragmentPagerAdapter 不改变 ViewPager 的布局

asp.net - 如何在类中使用SqlDependency?

c++ - 多线程练习