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

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

有没有办法过滤DDMS中底层树表的方法列表,只包括所选线程的统计信息(在我的情况下是UI线程)?

一个子问题:那里有一些优秀的Android分析器吗?

用户界面没有提供这样做的方法 – 你只需要浏览时间线并点击看起来很忙的部分。

有一种粗略的方法可以做你想要的。

SDK包含一个名为dmtracedump的工具,可用于从.trace文件生成报告。 当您使用DDMS获取跟踪时,请记下文件的位置(我的是/tmp/ddms4176182990461128308.trace )。 在Linux上,您将运行:

 dmtracedump -o  > 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是JDWP线程,它处理DDMS流量)。 接下来是一个操作代码:用于方法输入的ent ,用于方法退出的unr ,或用于因exception导致的堆栈展开的unr 。 之后是每线程CPU时间戳(即该线程使用的累计CPU时间),然后是方法名称和签名。

如果您只想查看主UI线程(线程ID 1),您可以使用:

 grep "^ 1 " trace.txt 

现在解析输出很简单。 🙂

如果您可以从跟踪文件中删除不感兴趣的线程的数据,然后使用traceview工具(包含在SDK中)打开新文件,则会更容易处理。 如果打开.trace文件,您可以看到它是一大块文本,后跟一大块二进制数据。 您需要编写一个程序来传递文本,然后解析二进制部分并删除任何线程ID而不是您感兴趣的线程ID。格式很简单 – 一组固定大小的记录 – 在分析代码顶部附近的注释中描述 。

(我不知道是否有人写过这个。)

要在某个线程(例如UI)上查看代码活动(带有调用堆栈的热点),我建议使用System Studio中的Intel VTune。 您可以在Android设备上收集Basic热点配置文件,打开Bottom-up选项卡并选择Grouping:Thread / Function / Callstack。 之后,您会看到应用程序的每个线程的热点配置文件。 (详见附页截图) 在此处输入图像描述

以下是如何使用VTune的教程: http : //software.intel.com/en-us/articles/using-intel-vtune-amplifier-on-non-rooted-android-devices

最好的android分析器肯定是“Eclipse Memory Analyzer”。 它允许您拍摄记忆的快照,并深入了解其中发生的事情。 请查看以下链接以了解有关它的更多信息。

http://eclipsesource.com/blogs/2013/01/21/10-tips-for-using-the-eclipse-memory-analyzer/