Настройка мониторинга скорости запуска приложения (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 + автоматические алерты.







