Systrace Profiler

SystraceProfiler – это инструмент профилирования, который позволяет измерять время выполнения конкретных участков кода, называемых «секциями». Путем измерения времени выполнения каждой секции вы можете выявить факторы, которые вызывают задержки в работе вашего приложения.

Использование секционного профайлера особенно полезно в крупных приложениях с распределенной системой из множества компонентов и сервисов. Профайлер позволяет быстрее идентифицировать проблемные участки кода и сосредоточиться на их улучшении для повышения общей производительности приложения. Применять его можно и при внесении изменений в проект, чтобы оценить, какое влияние оказали эти изменения.

SystraceProfiler инициализируется при запуске приложения, но для начала профилирования требуется явная разметка начала и конца секции анализа – время выполнения будет считаться между этими точками. Такой подход позволяет оценить скорость выполнения вплоть до конкретных методов и запросов.

Собранные данные профилирования находятся в разделе «Секционный профайлер». Здесь отображены данные о версии приложения, устройстве, ОС, теге, с которым было выполнено профилирование, и длительности его выполнения:

Количество отчётов ограничено – не более 500 штук в день. Все они автоматически сгруппированы по версии приложения и тэгу. Просмотреть результаты профилирования можно прямо в браузере по клику на интересующий отчет. Для каждого метода высчитано время выполнения, количество вхождений конкретного метода в секцию профилирования и прочие метрики:

Таким образом, секционный профайлер – мощный инструмент для анализа производительности кода, который помогает выявлять узкие места и проблемные участки, требующие оптимизации. В результате это ведет к повышению не только эффективности работы приложения, но и общего качества пользовательского опыта.

Подключение зависимостей к проекту

Перед началом использования плагина в вашем проекте, необходимо подключить зависимости:

В вашем <project>/<app-module>/build.gradle.kts

dependencies { implementation("ru.ok.tracer:tracer-profiler-systrace:0.2.16") }

Более подробное описание зависимостей ищите на странице Быстрый старт.

После подключения необходимых зависимостей нужно установить плагин в конфигурацию Tracer:

В вашем Application.kt

class MyApplication : Application(), HasTracerConfiguration { override val tracerConfiguration: List<TracerConfiguration> get() = listOf( SystraceProfilerConfiguration.build { // ваши опции }, ) }

Описание SystraceProfilerConfiguration

Настраивать работу плагина позволяет SystraceProfilerConfiguration.Builder, в котором есть следующие опции:

Опции SystraceProfilerConfiguration.Builder:

ОпцияОписание
setEnabledОтвечает за включение/выключение профилирования. По умолчанию включён

В SystraceProfilerConfiguration.Builder также есть устаревшие опции, использование которых не рекомендуется:

  • setDurationMs — время работы профайлера в ms;
  • addCondition — добавляет Condition для начала профилирования;

Профилирование и разметка секций

Запуск профайлера обозначается вызовом SystraceProfiler.start(), который принимает следующие параметры:

ПараметрОписание
context: ContextApp context приложения.
tag: StringТег, с которым результат будет загружен в Трейсер.
duration: LongВремя работы профайлера в ms.

Обозначить конец секции профилирования можно одним из следующих способов:

ОпцияОписание
SystraceProfiler.abort()Прекращает работу профайлера и очищает результат.
SystraceProfiler.commit(tagSuffix: String)Прекращает работу профайлера и отправляет результат. Если на момент вызова профайлер ещё не закончил работу, то результирующий тег будет равен <tag>_<tagSuffix>

Раннее мы уже упомянули, что для выполнения профилирования конкретного участка кода требуется явная разметка начала и конца интересующей секции. Класс android.os.Trace предоставляет простые методы для добавления меток в код вашего приложения:

МетодОписание
Trace.beginSection(String sectionName)Начинает секцию, которая будет представлять определенный участок кода. sectionName – название секции.
Trace.endSection()Метод закрывает секцию.

Мы рекомендуем оборачивать содержимое секции профилирования в try/finally – это важно для корректного закрытия секции в случае, если в процессе работы исследуемый метод выбросит исключение:

fun exampleMethod() { // запуск профайлера SystraceProfiler.start(context, "tag", 3000) // начало секции Trace.beginSection("exampleSection") try { // выполнение операций внутри секции // ... } finally { // закрытие секции Trace.endSection() } // завершение профилирования SystraceProfiler.commit("suffix")

По завершению профилирования в отчёте о результатах размеченный участок будет явно выделен: