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-интерфейсы синхронных событий общедоступными - если вы не возражаете против использования отражения для доступа к закрытым интерфейсам, вы также можете генерировать асинхронные события.

Другие вопросы по тегам