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.4.2") }
Более подробное описание зависимостей на странице Быстрый старт
После подключения необходимых зависимостей нужно установить плагин в конфигурацию Tracer:
В вашем Application.kt
class MyApplication : Application(), HasTracerConfiguration { override val tracerConfiguration: List<TracerConfiguration> get() = listOf( SamplingProfilerConfiguration.build { // ваши опции }, ) }
Настраивать работу плагина позволяет SamplingProfilerConfiguration.Builder
, в котором есть следующие опции:
Опция | Описание |
---|---|
setEnabled | Отвечает за включение/выключение профилирования. По умолчанию включён |
В SamplingProfilerConfiguration.Builder
также есть устаревшие опции, использование которых не рекомендуется:
setBufferSizeMb
— См. описание android.os.Debug.startMethodTracingSampling
;setSamplingIntervalUs
— См. описание android.os.Debug.startMethodTracingSampling
. По умолчанию 5000;Для оптимизации использования профайлера можно вручную размечать участки кода, для которых будет выполнено профилирование. Запускается профайлер вызовом SamplingProfiler.start()
, который принимает следующие параметры:
Параметр | Описание |
---|---|
context: Context | App context приложения. |
tag: String | Тег, с которым результат будет загружен в Трейсер. |
duration: Long | Время работы профайлера в ms. |
Дальнейшая настройка профилирования осуществляется с помощью опций:
Опция | Описание |
---|---|
SamplingProfiler.abort() | Прекращает работу профайлера и очищает результат. |
SamplingProfiler.commit() | Прекращает работу профайлера и отправляет результат. |
tagSuffix: String | Опционально. Суффикс, который будет добавлен к тегу. |
Пример: С вероятностью 1/100000
профайлер начнёт свою работу
if (Random.nextInt(100_000) == 0) { SamplingProfiler.start( context = appContext, tag = "stream_request", duration = 10_000, ) } // ... Код. Например, загрузка ленты SamplingProfiler.commit("loaded")