Мобильная игра не запускается: диагностика причин от кода до магазина приложений

Играть в текстовые ролевые игры бесплатно

Диагностика запуска

Игра не стартует — где искать причину

Сбой на сплеш-скрине, краш до главного меню, «белый экран» после обновления или режект в App Store. Разбираем 4 зоны отказа и алгоритм поиска виновника за 15 минут.

Устройство и ОС Магазины приложений Бэкенд и конфиг Клиентский код

Где именно ломается запуск

Любой сбой запуска попадает в одну из четырёх зон. Определите зону по симптому — и сразу сужаете круг поиска в 3-4 раза.

Устройство и ОС
Краш до первого кадра, черный экран, перезапуск при загрузке ассетов. Зависит от RAM, GPU, версии ОС, архитектуры (arm64/x86).
Магазины приложений
Режект при модерации, «Waiting for Review» вечно, не качается у пользователей, неверный bundle ID, проблемы с подписью/профилями.
Бэкенд и конфиг
Игра запускается, но виснет на «Connecting…», ошибка 401/503, Remote Config не приходит, CDN отдаёт 404 для бандлов.
Клиентский код
NullReference на Awake, бесконечный корутин, deadlock в потоке рендера, неинициализированные синглтоны, несовместимость IL2CPP/AOT.
Схема: воронка запуска
Воронка запуска мобильной игрыПоказывает последовательность этапов от тапа по иконке до игрового цикла с процентами потерь на каждом этапе Тап по иконке → 100% Запуск процесса ОС Нативная инициализация → 96% Unity/Unreal bootstrap, загрузка нативных библиотек Managed код (Awake/Start) → 88% Инициализация SDK, синглтонов, пулов, первого кадра Ассеты и Remote Config → 72% Addressables/AssetBundles, загрузка конфигов, CDN Рукотворка с сервером → 65% Авторизация, версия протокола, feature flags, античит Игровой цикл → 58% Первый кадр геймплея, ввод пользователя работает −4% ОС не запустила процесс −8% Краш нативного слоя −16% Исключение в managed −16% Таймаут ассетов/конфига −7% Сетевой отказ / версия ✓ Успешный запуск ~58%

Четыре зоны отказа — что проверять в первую очередь

Зона 1: Устройство и ОС

Самая коварная зона — ошибка не воспроизводится на дев-машине, но массово у пользователей.

  • RAM OOM kill: игра съедает > лимита ОС (iOS ~1.8 Гб на старых, Android — по cgroups). Проверяйте профайлером на устройствах с 2-3 Гб RAM.
  • GPU черновик: шейдеры, несовместимые с Mali/Adreno/PowerVR. Тестируйте на «тройке» чипсетов: Adreno, Mali, Apple GPU.
  • Архитектура: arm64-only билд не запустится на x86 эмуляторах и некоторых Chrome OS. Всегда собирайте universal (arm64 + armv7 при необходимости).
  • Версия ОС: минимальная поддерживаемая в манифесте/Info.plist должна совпадать с реально протестированной. Новые API (например, URP/HDRP) требуют iOS 13+ / Android 8+.
Быстрый тест: установите билд через ADB / Xcode на самом старом поддерживаемом устройстве. Если запустилось — 80% проблем устройства отсеяны.

Зона 2: Магазины приложений

Игра работает локально, но не доходит до пользователя или режектится модерацией.

  • Подпись и профили: expired Distribution сертификат, не тот Provisioning Profile (Development вместо Distribution), mismatch Bundle ID / package name.
  • App Store Connect / Play Console: не заполнены обязательные поля (Privacy Policy, Age Rating, Data Safety), скриншоты не соответствуют гайдлайнам.
  • App Tracking Transparency (iOS 14.5+): отсутствует NSUserTrackingUsageDescription — авторежект. На Android — не declarado AD_ID в Data Safety.
  • TestFlight / Internal Testing: билд не доступен тестерам — проверьте группы тестеров, срок действия билда (90 дней), версию CFBundleShortVersionString / versionName.
Быстрый тест: скачайте собственный билд через TestFlight / Play Internal на чистом устройстве без Xcode/Android Studio. Повторит ли пользователь ваш путь?

Зона 3: Бэкенд и конфиг

Игра запускается, но «висит на загрузке» или выдаёт ошибку сети.

  • Remote Config / Feature Flags: дефолтные значения отсутствуют, формат JSON невалиден, CDN отдаёт старую версию (кэш). Всегда имейте локальный fallback.
  • Версионирование API: клиент шлёт v2, сервер ожидает v3 — handshake фейлится. Внедряйте обязательную проверку версии при старте с понятным сообщением «Обновите игру».
  • CDN и ассет-бандлы: Addressables/AssetBundles возвращают 404 или 403. Проверьте заголовки CORS, подписи URL (signed URLs), срок действия ссылок.
  • Античит и защита: root/jailbreak detect блокирует запуск на легальных устройствах (кастомные прошивки, эмуляторы для тестов). Добавьте whitelist для QA-сборок.
Быстрый тест: curl / Postman к эндпоинтам инициализации с заголовками релизного билда (User-Agent, App-Version). Ответ 200 и валидный JSON — бэкенд жив.

Зона 4: Клиентский код

Краш в managed-слое до первого кадра. Часто маскируется под «черный экран».

  • Порядок инициализации: обращение к Instance до Awake, Race condition между SDK (Ads, Analytics, Push). Используйте ScriptableObject-конфиги и явный порядок через RuntimeInitializeOnLoadMethod.
  • IL2CPP / AOT: рефлексия, Generic-методы, LINQ в горячих путях — крашит только в релизе. Тестируйте IL2CPP билд на устройстве обязательно.
  • Striping уровни: High/Managed stripping вырезает код, используемый через рефлексию (JSON сериализация, DI контейнеры). Link.xml / preserve атрибуты — обязательны.
  • Необработанные исключения: Application.logMessageReceivedThreaded + отправка в Sentry/Firebase Crashlytics до инициализации SDK — ловите в нативном плагине или UnityPlayerActivity.
Быстрый тест: запустите Development Build с Script Debugging на устройстве. Лог в Xcode / logcat покажет стектрейс до первого кадра.

Алгоритм диагностики за 5 шагов

1

Симптом в логе

Соберите Device Log (logcat / Xcode Console / Crashlytics). Ищите: Exception type, Stack trace, Last loaded assembly, PID exit code.

2

Локализация этапа

Сопоставьте с воронкой: нативный бутстрэп → managed Awake → загрузка ассетов → нетворк → геймплей. Каждый этап оставляет следы в логе.

3

Минимальный репро

Отключите SDK по одному (Ads, Analytics, Push, Anti-cheat). Уберите Addressables, запустите пустую сцену. Найдите виновника методом исключения.

4

Проверка окружения

Очистите кэш приложения, переустановите, проверьте дату/время на устройстве, VPN, корпоративный MDM, свободное место (нужно > 500 Мб).

5

Фикс и регресс-тест

Исправьте, соберите Development → Release → QA на матрице устройств. Закройте тикет с логами «до/после» и коммитом фикса.

iOS vs Android: разные болячки, разный подход

iOS — частые причины

Code SigningAutomatic signing тянет Development профиль. Ручной выбор Distribution + правильный Team ID.
Bitcode / App ThinningBitcode deprecated, но App Thinning (on-demand resources) ломает запуск, если ODR теги не настроены.
SceneDelegate / UIApplicationiOS 13+ требует SceneDelegate. Unity 2020+ генерирует автоматически, но кастомные манифесты ломают цепочку.
ATS и HTTPApp Transport Security блокирует HTTP. NSAppTransportSecurity + exception domains или только HTTPS.
Launch Screen StoryboardОтсутствие или ошибки в LaunchScreen.storyboard → черный экран до готовности Unity.
TestFlight ProcessingПосле загрузки билд «Processing» 10-60 мин. Не отправляйте на ревью до появления иконки билда.

Android — частые причины

UnityPlayerActivityКастомный манифест без unityplayer.UnityPlayerActivity или с ошибками в intent-filter — краш при старте.
ProGuard / R8Стриппинг обфусцирует классы SDK (Firebase, Adjust, Store). proguard-rules.pro с -keep для всех интеграций.
App Bundle (AAB)Dynamic Delivery не отдаёт нативные либы для архитектуры устройства. Проверяйте bundletool get-device-spec.
Cleartext TrafficAndroid 9+ блокирует HTTP. android:usesCleartextTraffic=»true» в application теге + Network Security Config.
Google Play ServicesУстаревшая версия на устройстве пользователя. Проверяйте availability при старте, предлагайте обновление.
Keystore & SigningПотеря keystore = конец апдейтов. Play App Signing решает, но первый аплоад должен быть подписан верно.

5 типовых сценариев «не запускается» и что делать

Сценарий 1: «Чёрный экран 3-5 сек, потом краш на рабочий стол»

Обычно OOM на загрузке первой тяжелой сцены/атласа. Unity не успевает выгрузить ресурсы сплеша.

Zona 1
Фикс: Resources.UnloadUnusedAssets() перед загрузкой главной сцены, Addressables с LoadSceneMode.Additive, разбивка тяжелых атласов, StreamingAssets для видео.

Сценарий 2: «Висит на «Connecting…» бесконечно, ошибок в логе нет»

Сетевой таймаут без обработки. HTTP запрос уходит, ответ не приходит, UI блокирован, retry логики нет.

Zona 3
Фикс:UnityWebRequest с timeout (timeout = 10-15 сек), CancellationToken, экспоненциальный бэкофф, офлайн-режим с кэшированным конфигом, индикатор «проблемы с сетью».

Сценарий 3: «Работало вчера, сегодня после пуша в репозиторий — краш на Awake»

Кто-то закоммитил breaking change в инициализацию SDK или изменил порядок Script Execution Order.

Zona 4
Фикс:Git bisect + CI, запускающий Development Build на устройстве при каждом PR. Запрет мержа без зелёного Device Test.

Сценарий 4: «Релизный билд крашится, Development — работает идеально»

Классика IL2CPP + Stripping. Код, используемый через рефлексию (JSON.NET, Zenject, Addressables), вырезан оптимизатором.

Zona 4
Фикс:link.xml с preserve для сборок и типов, [Preserve] атрибуты, тестирование Release/IL2CPP билда на устройстве обязательно в CI.

Сценарий 5: «Модерация App Store: Guideline 2.1 — App crashes on launch»

Билд проходит локально, но ревьюер на своём устройстве получает краш. Часто — разные Entitlements, Capabilities или версия ОС ревьюера.

Zona 2
Фикс:Тестируйте на самой старой поддерживаемой ОС, проверяйте Entitlements (aps-environment, keychain-access-groups), отвечайте в Resolution Center с логами и билдом для воспроизведения.

Лучшая диагностика — та, которой не пришлось делать

Запуск — не момент, а процесс. Встройте предотвращение в пайплайн, а не в постмортем.

CI Device Farm

GitHub Actions / Bitrise / Codemagic: запуск билда на 5-10 реальных устройствах при каждом PR. Логи + скриншоты + видео в артефактах.

Матрица тестов

Таблица: OS версию × чипсет × RAM × ориентация × язык × сеть (WiFi/4G/офлайн). Минимум 12 комбинаций для релиза.

Staging ≠ Production

Отдельные бэкенд-эндпоинты, отдельные Remote Config, отдельные ключи SDK. Релизный билд качает staging конфиг — безопасная репетиция.

Запуск игры — это не галочка в чек-листе перед релизом. Это непрерывный сигнал от пользователя к коду и обратно. Настройте слушание этого сигнала раз — и каждая следующая ночь будет спокойнее.

Надоели сериалы и однотипные игры? 🎬

Попробуйте текстовые ролевые игры с ИИ-персонажами — это как интерактивная книга, где главный герой вы сами. Никакого пассивного просмотра: вы говорите, действуете и влияете на сюжет. ИИ подыгрывает в роли персонажа и ведёт историю дальше — увлекает не хуже любимого сериала, только теперь главный — вы.

Попробовать новый формат 👉 https://clck.ru/3Ta8kQ

Играть в текстовые ролевые игры бесплатно