android traceview 异步事件
Posted
技术标签:
【中文标题】android traceview 异步事件【英文标题】:android traceview asynchronous events 【发布时间】:2016-05-11 18:51:34 【问题描述】:我想使用 traceview 来衡量几个异步事件的性能。异步事件在类似于以下代码的回调中传递给我。
interface EventCallback
void onStartEvent(String name);
void onStopEvent(String name);
每个异步事件都将以“onStartEvent”调用开始,以“onStopEvent”调用结束。
我想为每个事件创建跟踪文件。从我在这里的阅读 (http://developer.android.com/tools/debugging/debugging-tracing.html#creatingtracefiles) 来看,不可能跟踪异步事件,因为调用的顺序必须像排序一样在“堆栈”中“结构化”。因此,对“Debug.stopMethodTracing()”的调用始终适用于对“Debug.startMethodTracing("calc");”的最新调用
所以,如果我按以下顺序收到回调。
onStartEvent(A)
onStartEvent(B)
onStopEvent(A)
onStopEvent(B)
这将被解释为
Debug.startMethodTracing("A");
Debug.startMethodTracing("B");
Debug.stopMethodTracing(); // 将应用于“B”而不是“A”
Debug.stopMethodTracing(); // 将应用于“A”而不是“B”
使用traceview,有什么办法可以做我想做的事吗?即跟踪“非结构化”异步事件?
【问题讨论】:
【参考方案1】:traceview 可能是错误的工具。如果你真的想走这条路,你可以保持一个“活动事件计数”,只要有一个事件正在处理,就保持跟踪文件打开。这可能会导致多个事件出现在同一个跟踪文件中,但您正在跟踪 VM 中的方法调用,因此没有简单的解决方法。
如果您的事件发生在不同的线程上,您可以通过后处理步骤将它们分开。这将需要一些努力来解析数据并删除不需要的记录。 (参见例如this 或this。)
您并没有真正说出您要衡量的内容。例如,如果您只需要开始/结束时间,您可以将它们写入您自己的日志文件并跳过所有跟踪视图的乐趣。
根据您的需求,systrace 可能更易于使用。不幸的是,自定义事件类 (Trace) 只公开了同步事件 API——如果您不介意使用反射来访问非公共接口,您也可以生成 async events。
【讨论】:
感谢您的帮助。我有兴趣捕捉表演。我注意到某些事件比其他事件花费的时间更长,我不仅想弄清楚它们需要多长时间,还想弄清楚是什么导致了这些问题。我尝试了 systrace,但它似乎没有从 traceview 中给我所需的信息。 请注意,我预计所有事件都需要大约相同的时间,但由于某种原因,某些事件需要更长的时间。当我在“systrace”中加载我的跟踪时,它没有像“traceview”那样向我显示方法分析信息。相反,它只是为我的每个“部分”绘制时间线,并向我展示发生了哪些系统活动。 traceview 告诉您每个方法需要多长时间,在一个应用程序中。 systrace 会告诉您整个系统中发生的所有事情,包括在哪个 CPU 内核上调度哪个线程(参见例如bigflake.com/systrace)。如果您捕获了“长”和“短”事件,您可以比较两者,看看慢的事件是否被其他进程中断,或者只需要很长时间才能执行。当您想知道程序的哪一部分一直在用完时,traceview 更容易使用,但 systrace 可以让您更深入地了解系统。以上是关于android traceview 异步事件的主要内容,如果未能解决你的问题,请参考以下文章