Моніторинг скорості запуску додатка (Launch Time Tracking)
Час холодного запуску — одна з небагатьох метрик, яку користувач помічає до того, як побачити хоч один екран додатка. Apple відхиляє додатки з cold launch > 20 секунд, але реальний поріг сприйняття — близько 2 секунд. Якщо ваші дані кажуть «запуск в середньому 1.2 сек», а P95 — 4.8 секунд, значить кожен двадцятий користувач чекає майже п'ять секунд. Без моніторингу цей хвіст невидимий.
Типи запусків
Cold launch — додаток не в пам'яті, процес створюється заново. Найповільніший, найважливіший для моніторингу.
Warm launch (iOS) — додаток був у пам'яті, але скинутий у background. Процес живий, але viewDidLoad виконується заново.
Hot launch — повернення з background. Практично миттєвий. Не плутати з warm: hot не потребує re-init.
Моніторте cold та warm. Hot не показовий.
Вбудовані інструменти платформ
iOS — MetricKit. Починаючи з iOS 13, система агрегує діагностику реальних користувачів та видає через MXMetricManager:
class AppDelegate: MXMetricManagerSubscriber {
func applicationDidFinishLaunching() {
MXMetricManager.shared.add(self)
}
func didReceive(_ payloads: [MXMetricPayload]) {
for payload in payloads {
if let launchMetric = payload.applicationLaunchMetrics {
let coldLaunchP50 = launchMetric.histogrammedTimeToFirstDrawKey
.histogram(for: .applicationLaunchTimeToFirstDraw)
// Відправляємо в аналітику
Analytics.track("cold_launch_p50", value: coldLaunchP50)
}
}
}
}
MetricKit видає дані раз на добу, агреговані за попередні 24 години. Не real-time, але реальна вибірка по всім користувачам.
Android — Firebase Performance Monitoring. app_start trace збирається автоматично при підключенні SDK. Розділяє app_start_cold та app_start_warm. Доступний у Firebase Console з розбивкою по пристроях, версіях ОС, версіях додатка.
Для кастомних міток у Android — FirebasePerformance.getInstance().newTrace("custom_init") + start() / stop(). Дозволяє зрозуміти, яка саме ініціалізація тормозить.
Інструментирование у коді
Навіть без зовнішніх SDK можна виміряти запуск самостійно.
iOS:
// У AppDelegate або @main
static let appLaunchTimestamp = Date()
// У viewDidAppear першого екрана
let launchDuration = Date().timeIntervalSince(AppDelegate.appLaunchTimestamp)
Analytics.track("cold_launch_duration", value: launchDuration)
Але цей метод неточний — не враховує pre-main час (динамічні бібліотеки, runtime). Для pre-main: змінна окружения DYLD_PRINT_STATISTICS у Xcode схемі.
Android:
class App : Application() {
override fun onCreate() {
val start = SystemClock.elapsedRealtime()
super.onCreate()
// ... ініціалізація
val initDuration = SystemClock.elapsedRealtime() - start
FirebaseAnalytics.getInstance(this).logEvent("app_init_duration") {
param("duration_ms", initDuration)
}
}
}
SystemClock.elapsedRealtime() точніше System.currentTimeMillis() для вимірювання інтервалів.
Dashboard та алерти
Мінімальний набір метрик для моніторингу:
| Метрика | Інструмент | Цільове значення |
|---|---|---|
| Cold launch P50 | Firebase / MetricKit | < 1.5 сек |
| Cold launch P95 | Firebase / MetricKit | < 3.0 сек |
| Cold launch по версіях | Firebase | Не растет |
| Slow cold launches (> 5 сек) | Firebase | < 5% |
Алерт на зростання P95 між версіями — важливіше абсолютного значення. Регресія на 500 мс між двома релізами — сигнал шукати винуватця в diff змін.
У Grafana або Firebase Alerts налаштовуємо сповіщення: якщо P95 cold launch у поточній версії перевищує P95 попередної версії на 20% — сповіщення в Slack.
Терміни настройки: один-два робочі дні для базової інтеграції Firebase Performance або MetricKit + автоматичні алерти.







