我想使用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,是否可以执行我想要的操作?即跟踪"非结构化"异步事件?
traceview可能是错误的工具。如果你真的想走这条路,你可以保留一个"活动事件计数",只要有事件在处理,就可以打开跟踪文件。这可能会导致多个事件出现在同一个跟踪文件中,但您正在跟踪VM中的方法调用,因此没有简单的方法可以解决这一问题。
如果您的事件发生在不同的线程上,您可以通过后处理步骤将它们分离出来。这将需要一些努力来解析数据并去除不需要的记录。(例如,参见此或此。)
你并没有真正说出你想要衡量的东西。例如,如果你只想要开始/结束时间,你可以把它们写到自己的日志文件中,跳过所有traceview的乐趣。
根据你所追求的,systrace可能更容易使用。不幸的是,自定义事件类(Trace)只公开同步事件API——如果您不介意使用反射访问非公共接口,那么您也可以生成异步事件。