На этой странице вы найдете помощь в устранении неполадок и ответы на часто задаваемые вопросы об использовании Crashlytics . Если вы не можете найти то, что ищете, или вам нужна дополнительная помощь, обратитесь в службу поддержки Firebase .
На этой странице вы найдете информацию по следующим темам:
Общая помощь в устранении неполадок , включая вопросы, касающиеся отображения данных или работы с данными в консоли Firebase , а также вопросы, касающиеся проблем, которые были решены ранее.
Поддержка по конкретным платформам , включая вопросы, касающиеся платформ Apple , Android и Unity .
Поддержка по вопросам интеграции , включая вопросы о BigQuery .
Общие вопросы по устранению неполадок/Часто задаваемые вопросы
В консоли Firebase вы можете заметить два разных формата для задач, перечисленных в таблице Issues . А также функцию под названием «варианты» в некоторых ваших задачах. Вот почему!
В начале 2023 года мы внедрили улучшенный механизм анализа для группировки событий, а также обновили дизайн и добавили ряд расширенных функций для новых задач (например, варианты!). Подробности смотрите в нашей недавней публикации в блоге , а основные моменты вы можете прочитать ниже.
Crashlytics анализирует все события вашего приложения (например, сбои, некритические ошибки и ошибки ANR) и создает группы событий, называемые проблемами — все события в одной проблеме имеют общую точку отказа.
Для группировки событий по этим категориям усовершенствованный механизм анализа теперь рассматривает множество аспектов события, включая кадры в трассировке стека, сообщение об исключении, код ошибки и другие характеристики платформы или типа ошибки.
Однако в рамках этой группы событий трассировки стека, приводящие к сбою, могут отличаться. Разная трассировка стека может означать другую первопричину. Чтобы отобразить это возможное различие внутри проблемы, мы теперь создаем варианты внутри проблем — каждый вариант представляет собой подгруппу событий в проблеме, имеющих одну и ту же точку отказа и похожую трассировку стека. С помощью вариантов можно отлаживать наиболее распространенные трассировки стека в рамках проблемы и определять, приводят ли к сбою разные первопричины.
Вот что вы увидите благодаря этим улучшениям:
Обновлены метаданные, отображаемые в строке описания проблемы.
Теперь стало проще понимать и сортировать проблемы в вашем приложении.Меньше дублирующих проблем
Изменение номера строки не приводит к возникновению новой проблемы.Упрощенная отладка сложных проблем с выявлением различных первопричин.
Используйте варианты для отладки наиболее распространенных трассировок стека в рамках одной проблемы.Более информативные оповещения и сигналы
Новая проблема фактически представляет собой новую ошибку.Более мощный поиск
Каждый выпуск содержит дополнительные метаданные, доступные для поиска, такие как тип исключения и имя пакета.
Вот как внедряются эти улучшения:
Когда мы получим новые события из вашего приложения, мы проверим, соответствуют ли они существующей проблеме.
Если совпадений не будет, мы автоматически применим к событию наш более интеллектуальный алгоритм группировки событий и создадим новую задачу с обновленным дизайном метаданных.
Это первое крупное обновление, которое мы вносим в нашу систему группировки мероприятий. Если у вас есть отзывы или вы столкнулись с какими-либо проблемами, сообщите нам об этом, отправив отчет.
Если вы не видите навигационную цепочку ( iOS+ | Android | Flutter | Unity ), рекомендуем проверить конфигурацию Google Analytics в вашем приложении. Убедитесь, что вы соответствуете следующим требованиям:
Вы включили Google Analytics в своем проекте Firebase.
Вы включили обмен данными для Google Analytics . Подробнее об этой настройке см. в разделе «Управление настройками обмена данными Analytics».
Вы добавили в свое приложение Firebase SDK для Google Analytics : iOS+ | Android | Flutter | Unity .
Этот SDK необходимо добавить в дополнение к Crashlytics SDK.Вы используете последние версии Firebase SDK для всех продуктов, которые используете в своем приложении ( iOS+ | Android | Flutter | Unity ).
Для платформ Apple и приложений Android особенно важно убедиться, что вы используете как минимум следующую версию Firebase SDK для Google Analytics :
iOS+ — v6.3.1+ (v8.9.0+ для macOS и tvOS) | Android — v17.2.3+ ( BoM v24.7.1+).
Если вы не видите оповещения о скорости, убедитесь, что используете...
Если вы не видите показателей без сбоев (например, количество пользователей и сессий без сбоев) или видите ненадежные показатели, проверьте следующее:
Убедитесь, что вы используете
Убедитесь, что настройки сбора данных не влияют на качество метрик, обеспечивающих бесперебойную работу системы:
Если вы включите сбор данных о сбоях, отключив автоматическую отправку отчетов, информация о сбоях будет отправляться в Crashlytics только от пользователей, которые явно дали согласие на сбор данных. Таким образом, точность метрик без сбоев пострадает, поскольку Crashlytics будет располагать информацией о сбоях только от этих пользователей, давших согласие (а не от всех ваших пользователей). Это означает, что ваши метрики без сбоев могут быть менее надежными и менее точно отражать общую стабильность вашего приложения.
Если у вас отключен автоматический сбор данных, вы можете использовать
sendUnsentReportsдля отправки кэшированных отчетов с устройства в Crashlytics . Использование этого метода отправит в Crashlytics данные о сбоях , но не данные о сессиях , из-за чего на графиках консоли будут отображаться низкие или нулевые значения метрик без сбоев.
См. раздел «Понимание показателей безотказной работы» .
Функция «Заметки» позволяет участникам проекта комментировать конкретные вопросы, сообщать о ходе работ и т. д.
Когда участник проекта публикует заметку, она помечается адресом электронной почты его учетной записи Google. Этот адрес электронной почты, вместе с заметкой, виден всем участникам проекта, имеющим доступ к просмотру заметки.
Ниже описаны права доступа, необходимые для просмотра, создания и удаления заметок:
Участники проекта, обладающие любой из следующих ролей, могут просматривать и удалять существующие заметки, а также писать новые заметки по теме.
Участники проекта, обладающие любой из следующих ролей, могут просматривать заметки, опубликованные по теме, но не могут удалять или писать заметки.
- Project Viewer , Firebase Viewer , Quality Viewer или Crashlytics Viewer
Проблема, которая ранее была закрыта, привела к регрессии, но Crashlytics получил новое сообщение о повторном возникновении проблемы. Crashlytics автоматически открывает эти регрессионные проблемы заново, чтобы вы могли устранить их в соответствии с потребностями вашего приложения.
Вот пример сценария, иллюстрирующий, как Crashlytics классифицирует проблему как регрессию:
- Впервые в истории Crashlytics получает сообщение о сбое "A". Crashlytics открывает соответствующую заявку по этому сбою (заявка "A").
- Вы быстро исправляете эту ошибку, закрываете проблему "А", а затем выпускаете новую версию своего приложения.
- После закрытия проблемы Crashlytics получает ещё один отчёт по вопросу "A".
- Если сообщение о сбое относится к версии приложения, о которой Crashlytics знал на момент закрытия проблемы (то есть, эта версия отправляла отчеты о сбоях при любых сбоях), то Crashlytics не будет считать проблему регрессивной. Проблема останется закрытой.
- Если сообщение о сбое относится к версии приложения, о которой Crashlytics не знал на момент закрытия проблемы (то есть, эта версия никогда не отправляла никаких отчетов о сбоях), то Crashlytics считает проблему регрессивной и откроет ее заново.
Когда возникает регрессия в решении проблемы, мы отправляем оповещение об обнаружении регрессии и добавляем сигнал регрессии к проблеме, чтобы сообщить вам, что Crashlytics повторно открыл её. Если вы не хотите, чтобы проблема была повторно открыта из-за нашего алгоритма обнаружения регрессии, «отключите уведомления» для этой проблемы вместо её закрытия.
Если сообщение о сбое относится к старой версии приложения, которая на момент закрытия проблемы вообще не отправляла никаких отчетов о сбоях, то Crashlytics считает проблему регрессивной и откроет ее заново.
Такая ситуация может возникнуть в следующем случае: вы исправили ошибку и выпустили новую версию приложения, но у вас всё ещё есть пользователи более ранних версий, в которых ошибка не исправлена. Если, по случайному совпадению, одна из этих ранних версий вообще не отправляла никаких отчётов о сбоях на момент закрытия проблемы, и эти пользователи начинают сталкиваться с ошибкой, то эти отчёты о сбоях приведут к возникновению регрессионной проблемы.
Если вы не хотите, чтобы проблема была вновь открыта из-за нашего алгоритма регрессии, вместо закрытия проблемы, «отключите уведомления» по этому вопросу.
Поддержка, специфичная для платформы
В следующих разделах представлена информация по устранению неполадок, специфичных для каждой платформы, а также ответы на часто задаваемые вопросы: iOS+ | Android | Unity .
Поддержка платформ Apple
Чтобы загрузить файлы dSYM вашего проекта и получить подробный вывод, выполните следующие действия:
Убедитесь, что этап сборки вашего проекта содержит скрипт запуска Crashlytics , который позволяет Xcode загружать dSYM-файлы вашего проекта во время сборки (см. раздел «Инициализация Crashlytics для получения инструкций по добавлению скрипта). После обновления проекта принудительно вызовите сбой и убедитесь, что сбой отображается на панели Crashlytics .
Если в консоли Firebase появляется сообщение "Отсутствует dSYM", проверьте Xcode, чтобы убедиться, что он корректно создает файлы dSYM для сборки.
Если Xcode корректно создает dSYM-файлы, но вы по-прежнему видите сообщения об их отсутствии, вероятно, инструмент выполнения скриптов зависает во время загрузки dSYM-файлов. В этом случае попробуйте следующее:
Убедитесь, что вы используете последнюю версию Crashlytics .
Загрузите недостающие файлы dSYM вручную:
- Вариант 1: Воспользуйтесь функцией «Перетаскивание» в консоли на вкладке dSYM , чтобы загрузить ZIP-архив, содержащий недостающие файлы dSYM.
- Вариант 2: Используйте скрипт
upload-symbolsдля загрузки отсутствующих файлов dSYM, используя указанные UUID на вкладке dSYM .
Если вы по-прежнему видите отсутствующие dSYM-файлы или загрузка по-прежнему не удается, обратитесь в службу поддержки Firebase и обязательно приложите журналы.
Если трассировка стека выглядит некорректно с точки зрения символов, проверьте следующее:
Если фреймы из библиотеки вашего приложения не содержат ссылок на код вашего приложения, убедитесь, что...
-fomit-frame-pointerне установлен в качестве флага компиляции.Если вы видите несколько
(Missing)кадров в библиотеке вашего приложения, проверьте, отсутствуют ли необязательные dSYM-файлы (для соответствующей версии приложения) на вкладке Crashlytics в консоли Firebase в Crashlytics. Если да, выполните действия по устранению неполадок, описанные в разделе «Предупреждение об отсутствии dSYM- файлов» в часто задаваемых вопросах по отсутствующим/не загружаемым dSYM-файлам на этой странице. Обратите внимание, что загрузка этих dSYM-файлов не будет символизировать уже произошедшие сбои, но это поможет обеспечить символизацию для будущих сбоев.
Да, вы можете интегрировать Crashlytics в проекты macOS и tvOS. Убедитесь, что вы включили версию 8.9.0+ Firebase SDK для Google Analytics , чтобы при возникновении сбоев был доступ к метрикам, собираемым Google Analytics (количество пользователей без сбоев, последний релиз, оповещения о скорости загрузки и навигационная цепочка).
Теперь вы можете сообщать о сбоях для нескольких приложений в одном проекте Firebase, даже если приложения собраны для разных платформ Apple (например, iOS, tvOS и Mac Catalyst). Ранее, если приложения имели одинаковый идентификатор пакета, вам приходилось разделять их на отдельные проекты Firebase.
поддержка Android
Crashlytics поддерживает отправку сообщений об ANR для приложений Android на устройствах под управлением Android 11 и выше. Используемый нами API для сбора сообщений об ANR ( getHistoricalProcessExitReasons ) более надежен, чем подходы, основанные на SIGQUIT или сторожевом таймере. Этот API доступен только на устройствах Android 11 и выше.
Если у некоторых ваших ANR отсутствуют идентификаторы BuildId ), выполните следующие действия для устранения неполадок:
Убедитесь, что вы используете актуальную версию Crashlytics Android SDK и плагина Crashlytics Gradle.
Если у вас отсутствуют
BuildIdдля Android 11 и некоторых ANR Android 12, то, вероятно, вы используете устаревший SDK, плагин Gradle или и то, и другое. Для корректного сбораBuildIdдля этих ANR необходимо использовать следующие версии:- Crashlytics Android SDK v18.3.5+ ( Firebase BoM v31.2.2+)
- Плагин Crashlytics для Gradle версии 2.9.4+
Проверьте, не используете ли вы нестандартное местоположение для своих общих библиотек.
Если у вас отсутствуют только
BuildIdдля общих библиотек вашего приложения, вероятно, вы используете нестандартное расположение общих библиотек. В этом случае Crashlytics может не найти соответствующиеBuildId. Мы рекомендуем рассмотреть возможность использования стандартного расположения общих библиотек.Убедитесь, что вы не удаляете
BuildIdв процессе сборки.Обратите внимание, что следующие советы по устранению неполадок применимы как к сбоям ANR, так и к сбоям, вызванным нативными функциями.
Проверьте наличие идентификаторов
BuildId), выполнив командуreadelf -nдля ваших бинарных файлов. Если идентификаторыBuildIdотсутствуют, добавьте-Wl,--build-idк флагам вашей системы сборки.Убедитесь, что вы случайно не удаляете
BuildId, пытаясь уменьшить размер APK-файла.Если вы храните урезанные и неурезанные версии библиотеки, убедитесь, что в вашем коде указана правильная версия.
Между количеством ошибок ANR в Google Play и Crashlytics может наблюдаться расхождение. Это ожидаемо из-за различий в механизме сбора и передачи данных об ошибках ANR. Crashlytics сообщает об ошибках ANR при следующем запуске приложения, тогда как Android Vitals отправляет данные об ошибках ANR после их возникновения.
Кроме того, Crashlytics отображает только ошибки ANR, возникающие на устройствах под управлением Android 11 и выше, в отличие от Google Play, который отображает ошибки ANR с устройств, на которых установлены сервисы Google Play и получено согласие на сбор данных.
Если приложение использует обфускатор, который не раскрывает расширение файла, Crashlytics по умолчанию генерирует каждую проблему с расширением файла .java .
Чтобы Crashlytics мог генерировать сообщения об ошибках с правильным расширением файла, убедитесь, что ваше приложение использует следующую конфигурацию:
- Использует Android Gradle 4.2.0 или выше.
- Используется R8 с включенной обфускацией. Чтобы обновить ваше приложение до R8, следуйте инструкциям в этой документации .
Обратите внимание, что после обновления до описанной выше конфигурации вы можете начать видеть новые проблемы в .kt , которые являются дубликатами существующих проблем в .java . Подробнее об этом см. в разделе часто задаваемых вопросов .
Начиная с середины декабря 2021 года, Crashlytics улучшила поддержку приложений, использующих Kotlin.
До недавнего времени доступные обфускаторы не указывали расширение файла, поэтому Crashlytics по умолчанию генерировал каждое сообщение об ошибке с расширением .java . Однако, начиная с Android Gradle 4.2.0, R8 поддерживает расширения файлов.
Благодаря этому обновлению Crashlytics теперь может определять, написан ли каждый класс, используемый в приложении, на Kotlin, и указывать правильное имя файла в подписи к сообщению об ошибке. Сбои теперь корректно приписываются файлам .kt (в зависимости от ситуации), если ваше приложение имеет следующую конфигурацию:
- Ваше приложение использует Android Gradle версии 4.2.0 или выше.
- Ваше приложение использует R8 с включенной обфускацией.
Поскольку в сигнатурах новых сбоев теперь указывается правильное расширение файла, вы можете увидеть новые проблемы с расширением .kt , которые на самом деле являются дубликатами существующих проблем с расширением .java . В консоли Firebase мы пытаемся определить и сообщить вам, если новая проблема с расширением .kt является возможным дубликатом существующей проблемы с расширением .java .
Если вы видите следующее исключение, вероятно, вы используете версию DexGuard, несовместимую с SDK Firebase Crashlytics :
java.lang.IllegalArgumentException: Transport backend 'cct' is not registered
Это исключение не приводит к сбою приложения, но препятствует отправке отчетов о сбоях. Чтобы это исправить:
Убедитесь, что вы используете последнюю версию DexGuard 8.x. В последней версии содержатся правила, необходимые для работы SDK Firebase Crashlytics .
Если вы не хотите менять версию DexGuard, попробуйте добавить следующую строку в правила обфускации (в файле конфигурации DexGuard):
-keepresourcexmlelements manifest/application/service/meta-data@value=cct
Последняя версия плагина Crashlytics для Gradle — это основная версия (v3.0.0), которая модернизирует SDK, исключая поддержку более старых версий Gradle и плагина Android Gradle. Кроме того, изменения в этом релизе устраняют проблемы с AGP v8.1+ и улучшают поддержку нативных приложений и пользовательских сборок.
Минимальные требования
Для работы плагина Crashlytics Gradle версии 3 требуются следующие минимальные параметры:
Плагин Android Gradle 8.1+
Обновите этот плагин с помощью плагина Android Gradle Upgrade Assistant в последней версии Android Studio.Плагин
google-servicesдля Firebase (версия Gradle 4.4.1+)
Для обновления этого плагина укажите последнюю версию в файле сборки Gradle вашего проекта следующим образом:
Kotlin
plugins { id("com.android.application") version "8.1.4" apply false id("com.google.gms.google-services") version "4.4.4" apply false ... }
Groovy
plugins { id 'com.android.application' version '8.1.4' apply false id 'com.google.gms.google-services' version '4.4.4' apply false ... }
Изменения в расширении Crashlytics
В версии 3 плагина Crashlytics для Gradle в расширении Crashlytics произошли следующие изменения, нарушающие совместимость:
Расширение удалено из блока android
defaultConfig. Вместо этого следует настраивать каждый вариант отдельно.Удалено устаревшее поле
mappingFile. Вместо него теперь автоматически предоставляется объединенный файл сопоставления.Удалено устаревшее поле
strippedNativeLibsDir. Вместо него следует использоватьunstrippedNativeLibsDirдля всех нативных библиотек.Изменено значение поля
unstrippedNativeLibsDirна кумулятивное.Заменено поле замыкания
symbolGeneratorдвумя новыми полями верхнего уровня:-
symbolGeneratorTypeстрока, содержащая либо"breakpad"(по умолчанию), либо"csym". -
breakpadBinary— файл, содержащий локальный исполняемый файлdump_symsпредназначенный для переопределения.
-
Пример того, как обновить расширение.
Kotlin
| До | buildTypes { release { configure<CrashlyticsExtension> { // ... symbolGenerator( closureOf<SymbolGenerator> { symbolGeneratorType = "breakpad" breakpadBinary = file("/PATH/TO/BREAKPAD/DUMP_SYMS") } ) } } } |
| Теперь в версии 3. | buildTypes { release { configure<CrashlyticsExtension> { // ... symbolGeneratorType = "breakpad" breakpadBinary = file("/PATH/TO/BREAKPAD/DUMP_SYMS") } } } |
Groovy
| До | buildTypes { release { firebaseCrashlytics { // ... symbolGenerator { breakpad { binary file("/PATH/TO/BREAKPAD/DUMP_SYMS") } } } } } |
| Теперь в версии 3. | buildTypes { release { firebaseCrashlytics { // ... symbolGeneratorType "breakpad" breakpadBinary file("/PATH/TO/BREAKPAD/DUMP_SYMS") } } } |
Специальная поддержка Android-NDK
Инструментальные цепочки LLVM и GNU имеют разные настройки по умолчанию и способы обработки сегмента только для чтения в бинарных файлах вашего приложения, что может привести к несогласованным трассировкам стека в консоли Firebase . Чтобы избежать этого, добавьте следующие флаги компоновщика в процесс сборки:
Если вы используете компоновщик
lldиз набора инструментов LLVM, добавьте:-Wl,--no-rosegmentЕсли вы используете компоновщик
ld.goldиз набора инструментов GNU, добавьте:-Wl,--rosegment
Если вы по-прежнему наблюдаете несоответствия в трассировке стека (или если ни один из флагов не относится к вашему набору инструментов), попробуйте вместо этого добавить в процесс сборки следующее:
-fno-omit-frame-pointer Плагин Crashlytics включает в себя настраиваемый генератор файлов символов Breakpad . Если вы предпочитаете использовать собственный исполняемый файл для генерации файлов символов Breakpad (например, если вы предпочитаете собирать все нативные исполняемые файлы в вашей цепочке сборки из исходного кода), используйте необязательное свойство расширения symbolGeneratorBinary чтобы указать путь к исполняемому файлу.
Путь к исполняемому файлу генератора символов Breakpad можно указать двумя способами:
Вариант 1 : Укажите путь через расширение
firebaseCrashlyticsв файлеbuild.gradleДобавьте следующее в файл
build.gradle.ktsна уровне приложения:Плагин Gradle версии 3.0.0+
android { buildTypes { release { configure<CrashlyticsExtension> { nativeSymbolUploadEnabled = true // Add these optional fields to specify the path to the executable symbolGeneratorType = "breakpad" breakpadBinary = file("/PATH/TO/BREAKPAD/DUMP_SYMS") } } } }
более низкие версии плагинов
android { // ... buildTypes { // ... release { // ... firebaseCrashlytics { // existing; required for either symbol file generator nativeSymbolUploadEnabled true // Add this optional new block to specify the path to the executable symbolGenerator { breakpad { binary file("/PATH/TO/BREAKPAD/DUMP_SYMS") } } } } }
Вариант 2 : Укажите путь через строку свойств в файле свойств Gradle.
Для указания пути к исполняемому файлу можно использовать свойство
com.google.firebase.crashlytics.breakpadBinary.Вы можете обновить файл свойств Gradle вручную или через командную строку. Например, чтобы указать путь через командную строку, используйте команду следующего вида:
./gradlew -Pcom.google.firebase.crashlytics.symbolGenerator=breakpad \ -Pcom.google.firebase.crashlytics.breakpadBinary=/PATH/TO/BREAKPAD/DUMP_SYMS \ app:assembleRelease app:uploadCrashlyticsSymbolFileRelease
Firebase Crashlytics NDK не поддерживает ARMv5 (armeabi). Поддержка этого ABI была удалена начиная с версии NDK r17.
Поддержка Unity
Если вы используете Unity IL2CPP и видите несимволичные трассировки стека, попробуйте следующее:
Убедитесь, что вы используете версию 8.6.1 или выше Crashlytics Unity SDK.
Убедитесь, что у вас настроена и запущена команда Firebase CLI
crashlytics:symbols:uploadдля генерации и загрузки файла символов.Эту команду CLI необходимо запускать каждый раз при создании релизной сборки или любой другой сборки, для которой вы хотите просмотреть символизированные трассировки стека в консоли Firebase . Подробнее см. в разделе «Получение читаемых отчетов о сбоях» .
Да, Crashlytics может отображать символизированные трассировки стека для ваших приложений, использующих IL2CPP. Эта возможность доступна для приложений, выпущенных как для Android, так и для Apple. Вот что вам нужно сделать:
Убедитесь, что вы используете версию 8.6.0 или выше Crashlytics Unity SDK.
Выполните необходимые задачи для вашей платформы:
Для приложений на платформе Apple : никаких специальных действий не требуется. Для приложений на платформе Apple плагин Firebase Unity Editor автоматически настраивает ваш проект Xcode для загрузки символов.
Для приложений Android : убедитесь, что у вас настроена и запущена команда Firebase CLI
crashlytics:symbols:uploadдля генерации и загрузки файла символов.Эту команду CLI необходимо запускать каждый раз при создании релизной сборки или любой другой сборки, для которой вы хотите просмотреть символизированные трассировки стека в консоли Firebase . Подробнее см. в разделе «Получение читаемых отчетов о сбоях» .
Сообщение о необработанных исключениях как о критических ошибках.
Crashlytics может сообщать о необработанных исключениях как о фатальных (начиная с версии 10.4.0 Unity SDK). Следующие часто задаваемые вопросы помогут объяснить обоснование и лучшие практики использования этой функции.
Сообщая о необработанных исключениях как о фатальных, вы получаете более реалистичное представление о том, какие исключения могут привести к невозможности запуска игры — даже если приложение продолжает работать.
Обратите внимание, что если вы начнете сообщать о критических ошибках, процент пользователей без сбоев (CFU), скорее всего, снизится, но показатель CFU будет более точно отражать опыт конечных пользователей при работе с вашим приложением.
Для того чтобы Crashlytics сообщила о необработанном исключении как о фатальной ошибке, должны быть выполнены оба следующих условия:
В процессе инициализации вашего приложения свойство
ReportUncaughtExceptionsAsFatalдолжно быть установлено вtrue.Ваше приложение (или включенная библиотека) генерирует исключение, которое не перехватывается. Исключение, которое создано, но не сгенерировано , не считается неперехваченным.
Если вы начинаете получать сообщения о необработанных исключениях как о фатальных ошибках, вот несколько вариантов обработки этих необработанных исключений:
- Подумайте, как вы можете начать перехватывать и обрабатывать эти необработанные исключения.
- Рассмотрите различные варианты регистрации исключений в консоли отладки Unity и в Crashlytics .
Перехватывать и обрабатывать выбрасываемые исключения.
Исключения создаются и генерируются для отражения неожиданных или исключительных состояний . Разрешение проблем, отраженных в сгенерированном исключении, включает в себя возврат программы в известное состояние (процесс, известный как обработка исключений ).
Рекомендуется перехватывать и обрабатывать все предусмотренные исключения, если только программу нельзя вернуть в известное состояние.
Чтобы контролировать, какие типы исключений будут перехватываться и обрабатываться каким кодом, оберните код, который может вызвать исключение, в блок try-catch . Убедитесь, что условия в блоках catch максимально узкие, чтобы обеспечить надлежащую обработку конкретных исключений.
Записывайте исключения в Unity или Crashlytics
В Unity или Crashlytics существует несколько способов записи исключений, которые помогут в отладке проблемы.
При использовании Crashlytics наиболее распространены и рекомендуются следующие два варианта:
Вариант 1: Выводить информацию в консоли Unity, но не отправлять её в Crashlytics во время разработки или устранения неполадок.
- Для вывода информации в консоль Unity используйте
Debug.Log(exception),Debug.LogWarning(exception)иDebug.LogError(exception), которые выводят содержимое исключения в консоль Unity и не генерируют его повторно.
- Для вывода информации в консоль Unity используйте
Вариант 2: Загрузка данных в Crashlytics для формирования сводных отчетов на панели управления Crashlytics в следующих ситуациях:
- Если исключение стоит зарегистрировать для отладки возможного последующего события Crashlytics , используйте
Crashlytics.Log(exception.ToString()). - Если, несмотря на то, что исключение было перехвачено и обработано, его все же необходимо отправить в Crashlytics , используйте
Crashlytics.LogException(exception), чтобы зарегистрировать его как некритическое событие.
- Если исключение стоит зарегистрировать для отладки возможного последующего события Crashlytics , используйте
Однако, если вы хотите вручную сообщить о фатальном событии в Unity Cloud Diagnostics, вы можете использовать Debug.LogException . Этот вариант выводит исключение в консоль Unity, как и вариант 1, но также генерирует исключение (независимо от того, было ли оно сгенерировано или перехвачено). Ошибка генерируется нелокально. Это означает, что даже окружающий Debug.LogException(exception) блоками try-catch все равно приведет к необработанному исключению.
Поэтому вызывайте Debug.LogException только в том случае, если хотите выполнить все перечисленные ниже действия:
- Чтобы вывести исключение в консоль Unity.
- Чтобы зарегистрировать исключение в Crashlytics как критическое событие.
- Чтобы сгенерировать исключение, его следует рассматривать как необработанное исключение и сообщать о нем в Unity Cloud Diagnostics.
Обратите внимание, что если вы хотите вывести перехваченное исключение в консоль Unity и загрузить его в Crashlytics как некритическое событие, выполните следующие действия:
try
{
methodThatThrowsMyCustomExceptionType();
}
catch(MyCustomExceptionType exception)
{
// Print the exception to the Unity console at the error level.
Debug.LogError(exception);
// Upload the exception to Crashlytics as a non-fatal event.
Crashlytics.LogException(exception); // not Debug.LogException
//
// Code that handles the exception
//
}
Поддержка интеграций
Если ваш проект использует Crashlytics вместе с Google Mobile Ads SDK, вероятно, что обработчики сбоев мешают регистрации обработчиков исключений. Чтобы исправить проблему, отключите отчеты о сбоях в Mobile Ads SDK, вызвав метод disableSDKCrashReporting .
Firebase экспортирует данные в местоположение набора данных, которое вы выбрали при настройке экспорта данных в BigQuery .
Это относится как к набору данных Crashlytics , так и к набору данных сессий Firebase (если экспорт данных о сессиях включен).
Это местоположение применимо только к данным, экспортированным в BigQuery , и не влияет на местоположение данных, хранящихся для использования на панели Crashlytics в консоли Firebase или в Android Studio.
После создания набора данных его местоположение изменить нельзя, но вы можете скопировать набор данных в другое место или вручную переместить (создать заново) его в другом месте. Для получения дополнительной информации см. раздел «Изменение местоположения существующих экспортов» .
В середине октября 2024 года Crashlytics запустила новую инфраструктуру для пакетного экспорта данных Crashlytics в BigQuery .
Если вы включили пакетный экспорт после октября 2024 года , то ваш проект Firebase автоматически использует новую инфраструктуру экспорта. Никаких действий не требуется.
Если вы включили пакетный экспорт до или во время октября 2024 года , ознакомьтесь с информацией в этом разделе часто задаваемых вопросов, чтобы определить, нужно ли вам предпринимать какие-либо действия.
Все проекты Firebase будут автоматически обновлены до новой инфраструктуры пакетного экспорта уже 9 января 2026 года. Вы можете обновиться и раньше, но убедитесь, что ваши таблицы BigQuery , обрабатываемые пакетным способом, соответствуют предварительным требованиям для обновления.
Вы можете перейти на новую инфраструктуру, но убедитесь, что ваши таблицы BigQuery для пакетной обработки соответствуют предварительным требованиям для обновления.
Определите, используете ли вы новую инфраструктуру.
Если вы включили пакетный экспорт в середине октября 2024 года или позже, то ваш проект Firebase автоматически использует новую инфраструктуру экспорта.
Вы можете проверить, какую инфраструктуру использует ваш проект: перейдите в консоль Google Cloud , и если в разделе «Конфигурация передачи данных» указано Firebase Crashlytics with Multi-Region Support », значит, ваш проект использует новую инфраструктуру экспорта.
Важные различия между старой и новой экспортной инфраструктурой.
Новая инфраструктура поддерживает размещение наборов данных Crashlytics за пределами Соединенных Штатов.
Функция экспорта была включена до середины октября 2024 года и обновлена до новой инфраструктуры экспорта — теперь вы можете по желанию изменить место экспорта данных .
Экспорт включен в середине октября 2024 года или позже — В процессе настройки вам было предложено выбрать место для экспорта данных.
Новая инфраструктура не поддерживает заполнение данных, полученных до включения функции экспорта.
Старая инфраструктура поддерживала заполнение данных за период до 30 дней до даты включения экспорта.
Новая инфраструктура поддерживает заполнение данных за последние 30 дней или за самую последнюю дату, когда вы включили экспорт в BigQuery (в зависимости от того, какая дата является самой последней).
В новой инфраструктуре таблицы пакетной обработки BigQuery именуются с использованием идентификаторов, заданных для ваших приложений Firebase в вашем проекте Firebase.
Старая инфраструктура записывала данные в пакетные таблицы, имена которых основывались на идентификаторах пакетов или именах файлов в исполняемом файле вашего приложения .
Новая инфраструктура записывает данные в пакетные таблицы с именами, основанными на идентификаторах пакетов или именах пакетов , заданных для зарегистрированных приложений Firebase в вашем проекте Firebase .
Шаг 1 : Необходимые условия для обновления
Убедитесь, что существующие таблицы BigQuery для пакетной обработки используют идентификаторы, совпадающие с идентификаторами пакетов или именами пакетов , указанными для зарегистрированных приложений Firebase в вашем проекте Firebase . Если они не совпадают, это может привести к сбоям в экспорте данных пакетной обработки. Большинство проектов будут находиться в корректном и совместимом состоянии, но важно проверить это перед обновлением.
Все приложения Firebase, зарегистрированные в вашем проекте Firebase, можно найти в консоли Firebase : перейдите в проекта , затем прокрутите до карточки «Ваши приложения», чтобы увидеть все ваши приложения Firebase и информацию о них.
You can find all your BigQuery batch tables in the BigQuery page of the Google Cloud console.
For example, here are ideal states where you won't have any issues upgrading:
You have a batch table named
com_yourcompany_yourproject_IOSand a Firebase iOS+ App with the bundle IDcom.yourcompany.yourprojectregistered in your Firebase project.You have a batch table named
com_yourcompany_yourproject_ANDROIDand a Firebase Android App with the package namecom.yourcompany.yourprojectregistered in your Firebase project.
If you have batch table names that do not match the identifiers set for your registered Firebase Apps, then follow the instructions later on this page before manually upgrading or before January 9, 2026 to avoid disruption to your batch export.
Step 2 : Manually upgrade to the new infrastructure
If you enabled batch export before mid-October 2024, then you can manually upgrade to the new infrastructure simply by toggling Crashlytics data export off and then on again in the Firebase console.
Вот подробная последовательность действий:
In the Firebase console, go to the Integrations page .
In the BigQuery card, click Manage .
Toggle off the Crashlytics slider to disable export. When prompted, confirm that you want data export to stop.
Immediately toggle on again the Crashlytics slider to re-enable export. When prompted, confirm that you want to export data.
Your Crashlytics data export to BigQuery is now using the new export infrastructure.
Your existing batch table name doesn't match your Firebase App identifier
If you have existing BigQuery batch tables in this state, then it means that they're not compatible with Firebase's new batch export-to- BigQuery infrastructure. Note that all Firebase projects will be automatically migrated to the new export infrastructure as early as January 9, 2026.
Follow the guidance in this section before manually upgrading or before January 9, 2026 to avoid disruption to the batch export of your Crashlytics data to BigQuery .
Jump to instructions for options to avoid disruptions
Understand how the export infrastructure uses identifiers to write data to BigQuery tables
Here's how the two export infrastructures write Crashlytics data to BigQuery batch tables:
Legacy export infrastructure : Writes data to a table with a name that's based on the bundle ID or package name in your app's binary .
New export infrastructure : Writes data to a table with a name that's based on the bundle ID or package name set for your registered Firebase App in your Firebase project .
Unfortunately, sometimes the bundle ID or package name in your app's binary doesn't match the bundle ID or package name set for your registered Firebase App in your Firebase project . This usually happens if someone didn't enter the actual identifier during app registration.
What happens if this isn't fixed before upgrading?
If the identifiers in these two locations don't match, then the following happens after upgrading to the new export infrastructure:
Your Crashlytics data will start writing to a new BigQuery batch table — that is, a new table with a name based on the bundle ID or package name set for your registered Firebase App in your Firebase project .
Any existing "legacy" table with a name based on the identifier in your app's binary will no longer have data written to it.
Example scenarios of mismatched identifiers
Note that BigQuery batch table names are automatically appended with _IOS or _ANDROID to indicate the platform of the app.
| Identifier(s) in your app's binary | Identifier(s) set for your Firebase App(s) | Legacy behavior | Behavior after upgrade to new export infrastructure | Решение |
|---|---|---|---|---|
foo | bar | Writes to a single table named after the identifier in app's binary ( foo ) | Creates then writes to a single table named after the identifier set for Firebase App ( bar ) | Implement either Option 1 or 2 described below. |
foo | bar , qux , etc. | Writes to a single table named after the identifier in app's binary ( foo ) | Creates* then writes to multiple tables named after the identifiers set for Firebase Apps ( bar , qux , etc.) | Implement Option 2 described below. |
foo , baz , etc. | bar | Writes to multiple tables named after the multiple identifiers in app's binary ( foo , baz , etc.) | Creates** then writes every app's data to a single table named after the identifier set for Firebase App ( bar ) | None of the options can be implemented. You can still differentiate data from each app within the single table by using the app's |
* If the identifier in your app's binary matched one of the identifiers set for a Firebase App, then the new export infrastructure won't create a new table for that identifier. Instead, it will continue writing data for that specific app to it. All other apps will be written to new tables.
** If one of the identifiers in your app's binary matched the identifier set for the Firebase App, then the new export infrastructure won't create a new table. Instead, it will maintain that table and start writing data for all apps to it.
Options to avoid disruption
To avoid any disruptions, follow the instructions for one of the options described below before you manually upgrade or before January 9, 2026.
OPTION 1 :
Use the new table created by the new export infrastructure. You'll copy data from your existing table to the new table.In the Firebase console, upgrade to the new export infrastructure by turning export off and then on again for the linked app.
This action creates a new batch table with a name that's based on the bundle ID or package name set for your registered Firebase App in your Firebase project .
In the Google Cloud console, copy all the data from your legacy table to the new table that was just created.
If you have any downstream dependencies that depend on your batch table, change them to use the new table.
OPTION 2 :
Continue writing to your existing table. You'll override some defaults in a BigQuery config to achieve this.In the Firebase console, find and take note of the Firebase App ID (for example,
1:1234567890:ios:321abc456def7890) of the app with the mismatched batch table name and identifier:
Go to your Project settings , then go the Your apps card to see all your Firebase Apps and their information.In the Firebase console, upgrade to the new export infrastructure by turning export off and then on again for the linked app.
This action does two things:
Creates a new batch table with a name that's based on the bundle ID or package name set for your registered Firebase App in your Firebase project . (You'll eventually delete this table, but do not delete it yet.)
Creates a BigQuery "data transfer config" with the source
Firebase Crashlytics with Multi-Region Support.
In the Google Cloud console, change the new "data transfer config" so that data will continue to write to your existing table:
Go to BigQuery > Data transfers to view your "data transfer config".
Select the config that has the source
Firebase Crashlytics with Multi-Region Support.Click Edit in the top-right corner.
In the Data source details section, find a list for gmp_app_id and a list for client_namespace .
In BigQuery , the Firebase App ID is called the
gmp_app_id. By default, theclient_namespacevalue in BigQuery is the corresponding unique bundle ID / package name of the app, but you'll be overriding this default configuration.BigQuery uses the
client_namespacevalue for the name of the batch table that each linked Firebase App writes to.Find the gmp_app_id of the Firebase App for which you want to override default settings. Change its client_namespace value to the name of the table you want the Firebase App to write to instead (usually this is the name of the legacy table the app was writing to with the legacy export infrastructure).
Save the config change.
Schedule a backfill for the days that your existing table is missing data.
Once the backfill is done, delete the new table that was automatically created by the new export infrastructure.