Sampling Profiler

Описание SamplingProfilerConfiguration

ANR (Application Not Responding) – тип ошибки, связанный с блокировкой основного потока приложения на продолжительное время (обычно более 5 секунд). В некоторых случаях возниковение ANR может быть связано с производительностью приложения и потреблением им ресурсов – в контексте решения такой проблемы на помощь приходят профайлеры.

SamplingProfiler – инструмент для анализа и оптимизации производительности вашего приложения. Плагин позволяет отслеживать время выполнения кода и оценить его эффективность вплоть до конкретных методов.

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

ВАЖНО! Держать профайлер в активном состоянии перманентно не стоит – от этого может пострадать производительность.

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

Сейчас количество отчётов о профилировании ограничено – не более 500 в сутки. Полученные сэмплы можно скачать и открыть с помощью инструментов для просмотра результатов профилирования. Мы рекомендуем Android Profiler в Android Studio:

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

Таким образом, Sampling Profiler позволяет проанализировать стек вызовов приложения, выявить долгие операции и участки кода, которые занимают много времени во время выполнения, а впоследствии – выявить проблемы, связаные с перегрузкой системы, что может привести к ANR (Application Not Responding), и оптимизировать работу приложения.

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

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

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

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

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

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

В вашем Application.kt

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

Конфигурация SamplingProfilerConfiguration

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

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

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

  • setBufferSizeMb — См. описание android.os.Debug.startMethodTracingSampling;
  • setSamplingIntervalUs — См. описание android.os.Debug.startMethodTracingSampling. По умолчанию 5000;
  • setDurationMs — время работы профайлера в ms;
  • addCondition — добавляет Condition для начала профилирования;

Ручное профилирование

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

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

Дальнейшая настройка профилирования осуществляется с помощью опций:

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

Пример: С вероятностью 1/100000 профайлер начнёт свою работу

if (Random.nextInt(100_000) == 0) { SamplingProfiler.start( context = appContext, tag = "stream_request", duration = 10_000, ) } // ... Код. Например, загрузка ленты SamplingProfiler.commit("loaded")