Настройка отслеживания App Hang / UI Freeze в мобильном приложении

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.
Разработка и поддержка любых видов мобильных приложений:
Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

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

Предлагаемые услуги
Показано 1 из 1 услугВсе 1735 услуг
Настройка отслеживания App Hang / UI Freeze в мобильном приложении
Средняя
от 4 часов до 2 рабочих дней
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    756
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    624
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1054
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    947
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    862
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    445

Настройка отслеживания App Hang / UI Freeze в мобильном приложении

App Hang — это не крэш. Приложение живо, но не реагирует на касания. Пользователь видит застывший экран, тыкает в кнопку ещё раз, потом ещё — и уходит. В Crashlytics ничего нет, пользователь молчит, конверсия падает.

iOS Watchdog завершает процесс при hang > 4–8 секунд. Android генерирует ANR при > 5 секунд. Но зависания 200–500ms не вызывают системных событий — они просто убивают UX.

Откуда берутся зависания

На iOS самый частый источник коротких фризов — синхронный вызов на main thread в реакции на UI-событие:

// Антипаттерн: декодируем большой JSON на main thread
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "ProductCell", for: indexPath) as! ProductCell
    // Если product.image — это Data, которую надо декодировать — это block main thread
    cell.imageView?.image = UIImage(data: product.imageData)
    return cell
}

UIImage(data:) синхронно декодирует JPEG/PNG. На iPhone SE с 1900x1200 изображением — 30–80ms блокировки main thread при каждом cellForRowAt.

На Android основной виновник Compose-экранов — лишние recomposition в LazyColumn:

// Антипаттерн: нестабильный тип в LazyColumn
@Composable
fun ProductList(products: List<Product>) { // List<> не стабильный тип
    LazyColumn {
        items(products) { product ->
            ProductCard(product) // перерисовывается при любом изменении родителя
        }
    }
}

Замена List<Product> на ImmutableList<Product> (kotlinx.collections.immutable) или использование @Stable-аннотации на data class убирает лишние recomposition.

Инструменты для обнаружения

iOS — MetricKit Hang Diagnostics

func didReceive(_ payloads: [MXDiagnosticPayload]) {
    for payload in payloads {
        payload.hangDiagnostics?.forEach { hang in
            let duration = hang.hangDuration
            let callStack = hang.callStackTree

            // hang.hangDuration — MXAverage, не точное значение
            // Минимальный трекинг для MetricKit: hang > 250ms
            print("Hang duration: \(duration.averageMeasurement)")
        }
    }
}

MetricKit отдаёт данные с суточной задержкой. Для real-time нужно собственное решение.

iOS — Sentry App Hang Detection

SentrySDK.start { options in
    options.dsn = "https://[email protected]/project"
    options.enableAppHangTracking = true
    options.appHangTimeoutInterval = 0.25 // 250ms — порог для репорта
}

Sentry запускает watchdog-поток, который пингует main thread каждые 100ms. Если ответа нет > appHangTimeoutInterval — снимает стек через backtrace_thread и отправляет как Issue.

Android — Jetpack Janky Frames

// FrameMetricsAggregator из AndroidX
val frameMetrics = FrameMetricsAggregator(FrameMetricsAggregator.JANK_DATA)
frameMetrics.add(activity)

// Позже:
val metrics = frameMetrics.metrics
metrics?.get(FrameMetricsAggregator.JANK_INDEX)?.let { jankArray ->
    val jankyFrames = jankArray.size
    // Количество фреймов > 16ms
}

Android — Android Profiler и Perfetto

В продакшене эти инструменты не используются, но для локальной диагностики — незаменимы. Android Profiler показывает System Trace: видно, где main thread занят, какие lock ожидаются, где GC-паузы.

Perfetto с android.view.Choreographer треком показывает dropped frames по экранам.

Настройка мониторинга в Datadog

// Трекинг Long Tasks в Datadog RUM
RUM.enable(with: RUM.Configuration(
    applicationID: "your-rum-app-id",
    longTaskThreshold: 0.1 // 100ms — всё, что дольше, попадает как Long Task
))

В Datadog дашборде строим виджет:

count:rum.long_task{env:production,service:ios-app}
group_by: @view.name
visualize_as: top_list

Это покажет, на каких экранах больше всего Long Tasks — и именно там копаем дальше.

Что делаем

  • Подключаем Sentry enableAppHangTracking с порогом 250ms (iOS)
  • Настраиваем MetricKit subscriber для daily diagnostics
  • Включаем Datadog RUM Long Task tracking с порогом 100ms
  • На Android настраиваем FrameMetricsAggregator для ключевых Activity
  • Строим дашборд по экранам с наибольшим числом Long Tasks
  • Анализируем stack traces и выявляем конкретные виновники

Сроки

Базовая настройка через Sentry и Datadog: 4–8 часов. Полная диагностика с MetricKit и кастомными метриками по экранам: 1–2 дня. Стоимость рассчитывается индивидуально.