android traceview асинхронные события
Я хотел бы использовать трассировку для измерения производительности для нескольких асинхронных событий. Асинхронные события передаются мне в обратном вызове, который похож на приведенный ниже код.
interface EventCallback {
void onStartEvent(String name);
void onStopEvent(String name);
}
где каждое асинхронное событие начинается с вызова onStartEvent и заканчивается вызовом onStopEvent.
Я хотел бы создать файлы трассировки для каждого события. Из моего прочтения здесь ( http://developer.android.com/tools/debugging/debugging-tracing.html) невозможно отследить асинхронные события, поскольку порядок вызовов должен быть "структурирован" в "стеке" нравится заказ. Таким образом, вызов "Debug.stopMethodTracing()" всегда применяется к самому последнему вызову "Debug.startMethodTracing("calc");"
Итак, если я получаю обратные вызовы в следующем порядке.
onStartEvent (А)
onStartEvent (В)
onStopEvent (А)
onStopEvent (В)
который будет интерпретирован как
Debug.startMethodTracing ("А");
Debug.startMethodTracing ("В");
Debug.stopMethodTracing (); // будет применяться к "B" вместо "A"
Debug.stopMethodTracing (); // будет применяться к "A" вместо "B"
Используя traceview, можно ли в любом случае делать то, что я хочу? т.е. проследить "неструктурированные" асинхронные события?
1 ответ
traceview может быть неправильным инструментом. Если вы действительно хотите пойти по этому пути, вы можете сохранить "счетчик активных событий" и оставить файл трассировки открытым, пока происходит обработка события. Это может привести к тому, что в одном и том же файле трассировки будут присутствовать несколько событий, но вы отслеживаете вызовы методов в виртуальной машине, поэтому простого способа избежать этого нет.
Если ваши события происходят в разных потоках, вы можете выделить их с помощью шага постобработки. Это потребует определенных усилий для анализа данных и удаления нежелательных записей. (См., Например, это или это.)
Вы действительно не говорите, что вы пытаетесь измерить. Например, если вы просто хотите узнать время начала / окончания, вы можете просто записать их в собственный файл журнала и пропустить все забавные трассировки.
В зависимости от того, что вам нужно, с systrace может быть проще работать. К сожалению, пользовательский класс событий ( Trace) только делает API-интерфейсы синхронных событий общедоступными - если вы не возражаете против использования отражения для доступа к закрытым интерфейсам, вы также можете генерировать асинхронные события.