android traceview 异步事件
android traceview asynchronous events
我想使用 traceview 来测量几个异步事件的性能。异步事件在类似于以下代码的回调中传递给我。
interface EventCallback {
void onStartEvent(String name);
void onStopEvent(String name);
}
其中每个异步事件都将以 "onStartEvent" 调用开始并以 "onStopEvent" 调用结束。
我想为每个事件创建跟踪文件。根据我在这里的阅读 (http://developer.android.com/tools/debugging/debugging-tracing.html#creatingtracefiles),不可能跟踪异步事件,因为调用的顺序必须是 "structured",类似于 "stack" 的顺序。因此,对 "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,有没有办法做我想做的?即跟踪 "non-structured" 个异步事件?
traceview 可能是错误的工具。如果你真的想走这条路,你可以保留一个 "active event count",并保持跟踪文件打开,只要有一个事件正在处理。这可能会导致多个事件出现在同一个跟踪文件中,但您是在 VM 中跟踪方法调用,因此没有简单的解决方法。
如果您的事件发生在不同的线程上,您可以使用 post 处理步骤将它们分开。这将需要一些努力来解析数据并删除不需要的记录。 (参见 this or this。)
您并没有真正说出您要衡量的内容。例如,如果您只想要 start/end 次,您可以将它们写入您自己的日志文件并跳过所有 traceview 的乐趣。
根据您的要求,systrace may be easier to work with. Unfortunately the custom event class (Trace) only makes the synchronous event APIs public -- if you don't mind using reflection to access non-public interfaces you can also generate async events。
我想使用 traceview 来测量几个异步事件的性能。异步事件在类似于以下代码的回调中传递给我。
interface EventCallback {
void onStartEvent(String name);
void onStopEvent(String name);
}
其中每个异步事件都将以 "onStartEvent" 调用开始并以 "onStopEvent" 调用结束。
我想为每个事件创建跟踪文件。根据我在这里的阅读 (http://developer.android.com/tools/debugging/debugging-tracing.html#creatingtracefiles),不可能跟踪异步事件,因为调用的顺序必须是 "structured",类似于 "stack" 的顺序。因此,对 "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,有没有办法做我想做的?即跟踪 "non-structured" 个异步事件?
traceview 可能是错误的工具。如果你真的想走这条路,你可以保留一个 "active event count",并保持跟踪文件打开,只要有一个事件正在处理。这可能会导致多个事件出现在同一个跟踪文件中,但您是在 VM 中跟踪方法调用,因此没有简单的解决方法。
如果您的事件发生在不同的线程上,您可以使用 post 处理步骤将它们分开。这将需要一些努力来解析数据并删除不需要的记录。 (参见 this or this。)
您并没有真正说出您要衡量的内容。例如,如果您只想要 start/end 次,您可以将它们写入您自己的日志文件并跳过所有 traceview 的乐趣。
根据您的要求,systrace may be easier to work with. Unfortunately the custom event class (Trace) only makes the synchronous event APIs public -- if you don't mind using reflection to access non-public interfaces you can also generate async events。