Ви запускаєте мобільну VR-гру на Quest 3. Через тиждень — потік скарг: вилітає на Horizon OS, в логах лише hex-адреси. Без crash reporting ви втрачаєте дні на ручний пошук. Ми налаштували моніторинг для десятка VR-проектів — розбираємо, як виключити сліпі зони. Один такий кейс: гра з URP та динамічними тінями падала на Pico 4 через некоректний unload AssetBundle. Crashlytics показав hex-стек, який після symbolication вказав на AssetBundle.Unload(true) в невірному потоці. Виправлення зайняло дві години замість двох тижнів. Після налаштування symbolication crash-free rate зріс з 94% до 99.2% — це стандартна динаміка для VR-проектів з нашою інтеграцією.
Чому стандартний Unity Crash Reporter не працює для VR?
Unity Cloud Diagnostics та вбудований UnityCrashHandler покривають C#-виключення, але 90% крішів у VR — нативні: SIGSEGV, SIGABRT. Вони приходять з hex-стеком, який без NDK symbolication не читається. Ось реальний приклад: Quest 2, Unity LTS, URP — кріш на Horizon OS. Стек: #00 pc 0x00000000012abc14 /data/app/.../libunity.so. Після завантаження symbol table він розкривається у виклик Vulkan buffer allocation, який ліг через зміну memory limits. Для IL2CPP-збірок потрібні .pdb або il2cpp_data — без них Firebase Crashlytics покаже нативний стек без маппінгу на C#.
Oculus Developer Center рекомендує завантажувати symbols для кожної збірки. Це єдиний спосіб отримати читабельний стек для нативних крішів.
Firebase Crashlytics чи Sentry: що обрати для VR?
Firebase Crashlytics — стандарт для мобільного VR. Інтеграція через Firebase Unity SDK: додайте google-services.json, налаштуйте launcherTemplate.gradle. Увімкніть android.useNewApkSplitting для коректного маппінгу версій. Завантаження NDK symbols — через CLI: firebase crashlytics:symbols:upload --app=APP_ID path/to/libil2cpp.so. Важливо: завжди завантажуйте symbols для кожної використовуваної версії Unity.
Sentry дає більше гнучкості: можна розгорнути on-premise для конфіденційних даних та налаштувати кастомні event-логи. Ми часто пропонуємо комбінацію: Crashlytics для автоматичного збору, Sentry для подій під NDA. Обидва інструменти підтримують фільтрацію за версією ОС, моделлю та версією гри.
| Інструмент | Час інтеграції | Symbolication | On-premise |
|---|---|---|---|
| Firebase Crashlytics | 1–2 дні | + IL2CPP, NDK | — |
| Sentry | 2–3 дні | + IL2CPP, NDK | + |
Firebase Crashlytics швидше Sentry приблизно вдвічі на етапі базової інтеграції, але Sentry виграє в кастомізації. На одному проекті ми зекономили 40% часу QA після налаштування symbolication — crash-free rate зріс з 94% до 99.2% за два тижні.
Як завантажити NDK symbols у Firebase Crashlytics?
Процес включає завантаження .pdb для IL2CPP та .sym для нативного коду. Для Unity IL2CPP: у білді створюється il2cpp_data — його потрібно перетворити на symbol файл через il2cpp-symbols.zip. Для нативного NDK: використовуйте ndk-stack або Firebase CLI. Ми автоматизуємо цей крок у CI/CD: після кожної збірки Jenkins завантажує symbols, щоб не втрачати версії. Гарантуємо, що symbol upload не ламає пайплайн.
Як ми налаштовуємо моніторинг під ключ
Процес включає п'ять етапів:
- Аналітика: вивчення поточного білда, версії Unity, платформи, сценаріїв крішів.
- Інтеграція: підключення Crashlytics та/або Sentry, налаштування symbol upload у CI/CD.
- Кастомізація: додавання breadcrumbs, custom events, soft error logging.
- Тестування: симуляція крішів, перевірка стека, налаштування аліасів.
- Документація: інструкція з розбору крішів для команди.
| Етап | Тривалість |
|---|---|
| Базова інтеграція Crashlytics з symbolication | 1–2 робочих дні |
| Повний стек (Crashlytics + Sentry + custom events) | 3–5 робочих днів |
| Розбір та виправлення топ-5 крішів після запуску | 1–3 тижні |
Типові причини крішів у мобільних VR-іграх
Основні проблеми: Out of Memory (Quest 3 залишає застосунку близько 3-4 ГБ), витоки нативної пам'яті, некоректний unload AssetBundle, Vulkan validation errors, threading violations. Наприклад, звернення до Unity API не з main thread — часта причина SIGABRT. Після впровадження ми підтримуємо дашборд з фільтрацією за версією Horizon OS, моделлю пристрою та версією гри. Ключова метрика — crash-free rate: для VR норма вище 99%, якщо нижче 97% — термінове розслідування. В одному проекті витік AssetBundle давав 3% крішів — після фіксу показник повернувся до 99.5%.
Що ви отримуєте в результаті?
- Повна visibility крішів: managed + native.
- Скорочення часу пошуку причини з тижнів до годин.
- Можливість фільтрувати за версією ОС, моделлю, версією гри.
- Навчання команди роботі з дашбордом.
Замовте інтеграцію — ми оцінимо ваш проект і запропонуємо оптимальний стек. Для початку достатньо надіслати білд та список цільових пристроїв. Отримайте консультацію: наші інженери допоможуть обрати інструменти та налаштувати пайплайн symbol upload.






