Kar*_*pka 4 java multithreading android profiling ddms
我试图在某些条件下在我的应用程序中找到UI线程冻结的原因.
我通过DDMS分析运行了应用程序.但是在底部的树表视图中,我看到所有线程都调用了所有方法,而我只想关注主线程.
有没有办法过滤DDMS中底层树表的方法列表,只包括所选线程的统计信息(在我的情况下是UI线程)?
一个子问题:那里有一些好的Android分析器吗?
用户界面没有提供这样做的方法 - 你只需要浏览时间线并点击看起来很忙的部分.
有一种粗略的方法可以做你想要的.
SDK包含一个名为的工具dmtracedump,可用于从.trace文件生成报告.当您使用DDMS获取跟踪时,请记下文件的位置(我的位置/tmp/ddms4176182990461128308.trace).在Linux上,您将运行:
dmtracedump -o <filename> > trace.txt
Run Code Online (Sandbox Code Playgroud)
这将为您提供如下文件:
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;
...
Run Code Online (Sandbox Code Playgroud)
如输出中所述,每行以对应于顶部表的线程ID开头(因此线程ID 4是处理DDMS流量的JDWP线程).接下来是一个操作代码:ent用于方法输入,xit用于方法退出,或unr用于由于异常而导致的堆栈展开.之后是每线程CPU时间戳(即该线程使用的累计CPU时间),然后是方法名称和签名.
如果您只想查看主UI线程(线程ID 1),您可以使用:
grep "^ 1 " trace.txt
Run Code Online (Sandbox Code Playgroud)
现在解析输出很简单.:-)
如果您可以从跟踪文件中删除不感兴趣的线程的数据,然后使用该traceview工具(包含在SDK中)打开新文件,则会更容易处理.如果你打开一个.trace文件,你会发现它是一大块文本,后跟一大块二进制数据.您需要编写一个程序来传递文本,然后解析二进制部分并删除任何线程ID而不是您感兴趣的线程ID.格式很简单 - 一组固定大小的记录 - 在分析代码顶部附近的注释中描述.
(我不知道是否有人写过这个.)