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

原文 标签 java android multithreading profiling ddms

我试图在某些条件下找到我的应用程序中 UI 线程卡住的原因。
我已经通过 DDMS 分析运行了该应用程序。但是在底部的树表 View 中,我看到了在所有线程上调用的所有方法,而我只想关注主线程。

有没有办法过滤 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 而非您感兴趣的任何内容。格式很简单——一组固定大小的记录——在 profiling code 顶部附近的评论中描述.

(不知道有没有人写过这个。)

关于java - Android - 通过 DDMS 分析特定线程(UI 线程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22935464/

相关文章:

java - 在Java中调整图像大小

android - 如何从Android中的aChartEngine制作自定义圆环图?

java - 如何使用带有ThreadExecutor的自定义比较器实现BlockingQueue?

java - 如何使用Selenium WebDriver克服SSL证书

java - JSP 编译器在使用 "+"运算符时显示错误

android - 如何在Firebase中将循环中的子级添加为userId

java - 我在animate()中遇到错误,这是“错误:无法从静态上下文中引用非静态方法animate()”

java - 扩展线程以测试连接是否正确终止?

java - Keep-alive 如何与 ThreadPoolExecutor 一起工作?

java - 如何在其他类(class)中阅读Netty中的消息