我想使用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&#34);
Debug.startMethodTracing(" B&#34);
Debug.stopMethodTracing(); //将适用于" B"而不是" A"
Debug.stopMethodTracing(); //将适用于" A"而不是" B"
使用traceview,无论如何都可以做我想要的事情吗?即跟踪"非结构化"异步事件?
答案 0 :(得分:1)
traceview可能是错误的工具。如果您真的想要使用此路由,则可以保留“活动事件计数”,并且只要存在正在处理的事件,就会保持跟踪文件处于打开状态。这可能导致同一跟踪文件中出现多个事件,但是您正在跟踪VM中的方法调用,因此没有简单的方法。
如果您的事件发生在不同的线程上,您可以使用后处理步骤将它们分开。这需要一些努力来解析数据并去掉不需要的记录。 (例如,请参阅this或this。)
你并没有真正说出你想要测量的东西。例如,如果您只想要开始/结束时间,您可以将它们写入您自己的日志文件中,并跳过所有跟踪视图的乐趣。
根据您的目标,systrace可能更容易使用。遗憾的是,自定义事件类(Trace)仅公开同步事件API - 如果您不介意使用反射来访问非公共接口,您还可以生成async events。