На этой странице представлена помощь по устранению неполадок и ответы на часто задаваемые вопросы об использовании Crashlytics . Если вы не можете найти то, что ищете, или вам нужна дополнительная помощь, обратитесь в службу поддержки Firebase .
Общее устранение неполадок/часто задаваемые вопросы
Вы можете заметить два разных формата проблем, перечисленных в таблице «Проблемы» в консоли Firebase . И вы также можете заметить функцию под названием «варианты» в некоторых ваших задачах. Вот почему!
В начале 2023 года мы представили улучшенный механизм анализа для группировки событий, а также обновленный дизайн и некоторые расширенные функции для новых проблем (например, вариантов!). Подробности читайте в нашем недавнем сообщении в блоге , а основные моменты вы можете прочитать ниже.
Crashlytics анализирует все события вашего приложения (например, сбои, нефатальные ошибки и ошибки ANR) и создает группы событий, называемые проблемами — все события в проблеме имеют общую точку сбоя.
Чтобы сгруппировать события по этим проблемам, улучшенный механизм анализа теперь анализирует многие аспекты события, включая кадры в трассировке стека, сообщение об исключении, код ошибки и другие характеристики платформы или типа ошибки.
Однако в этой группе событий трассировки стека, приводящие к сбою, могут быть разными. Другая трассировка стека может означать другую основную причину. Чтобы представить эту возможную разницу внутри проблемы, мы теперь создаем варианты внутри задач — каждый вариант представляет собой подгруппу событий в задаче, которые имеют одну и ту же точку отказа и аналогичную трассировку стека. С помощью вариантов вы можете отладить наиболее распространенные трассировки стека внутри проблемы и определить, приводят ли к сбою различные основные причины.
Вот что вы получите благодаря этим улучшениям:
Обновленные метаданные, отображаемые в строке проблемы.
Теперь стало проще понимать и сортировать проблемы в вашем приложении.Меньше повторяющихся проблем
Изменение номера строки не приводит к возникновению новой проблемы.Упрощенная отладка сложных проблем с различными первопричинами.
Используйте варианты для отладки наиболее распространенных трассировок стека в задаче.Более содержательные оповещения и сигналы
Новая проблема на самом деле представляет собой новую ошибку.Более мощный поиск
Каждая проблема содержит больше метаданных, доступных для поиска, таких как тип исключения и имя пакета.
Вот как эти улучшения реализуются:
Когда мы получаем новые события из вашего приложения, мы проверяем, соответствуют ли они существующей проблеме.
Если совпадений нет, мы автоматически применим к событию наш более умный алгоритм группировки событий и создадим новую проблему с обновленным дизайном метаданных.
Это первое большое обновление, которое мы вносим в нашу группу событий. Если у вас есть отзывы или возникли какие-либо проблемы, сообщите нам об этом, отправив отчет.
Если вы не видите навигационные журналы , рекомендуем проверить конфигурацию вашего приложения для Google Analytics . Убедитесь, что вы соответствуете следующим требованиям:
Вы включили Google Analytics в своем проекте Firebase.
Вы включили обмен данными для Google Analytics . Подробнее об этом параметре читайте в разделе «Управление настройками общего доступа к данным Google Analytics».
У тебя естьдобавлен Firebase SDK для Google Analyticsв ваше приложение. Этот SDK необходимо добавить в дополнение к Crashlytics SDK.
Вы используетепоследние версии Firebase SDKдля всех продуктов, которые вы используете в своем приложении.
Особенно убедитесь, что вы используете как минимум следующую версию Firebase SDK для Google Analytics :
Android — v17.2.3+ ( BoM v24.7.1+).
Если вы не видите оповещения о скорости, убедитесь, что вы используетеCrashlytics SDK v18.6.0+ (или Firebase BoM v32.6.0+).
Если вы не видите показателей отсутствия сбоев (например, пользователей и сеансов без сбоев) или видите ненадежные показатели, проверьте следующее:
Убедитесь, что вы используетеCrashlytics SDK v18.6.0+ (или Firebase BoM v32.6.0+).
Убедитесь, что настройки сбора данных не влияют на качество показателей безотказности:
Если вы включите возможность создания отчетов о сбоях, отключив автоматические отчеты о сбоях, информация о сбоях может быть отправлена в Crashlytics только от пользователей, которые явно согласились на сбор данных. Таким образом, это повлияет на точность показателей отсутствия сбоев, поскольку Crashlytics собирает информацию о сбоях только от этих согласившихся пользователей (а не от всех ваших пользователей). Это означает, что ваши показатели отсутствия сбоев могут быть менее надежными и менее отражающими общую стабильность вашего приложения.
Если у вас отключен автоматический сбор данных, вы можете использовать
sendUnsentReports
для отправки кэшированных отчетов на устройстве в Crashlytics . При использовании этого метода в Crashlytics будут отправляться данные о сбоях , но не данные сеансов , из-за чего на диаграммах консоли будут отображаться низкие или нулевые значения для показателей без сбоев.
См. раздел Общие сведения о показателях отсутствия сбоев .
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 v2.9.4+
Проверьте, не используете ли вы нестандартное расположение для своих общих библиотек.
Если вам не хватает только
BuildId
для общих библиотек вашего приложения, вполне вероятно, что вы не используете стандартное расположение по умолчанию для общих библиотек. В этом случае Crashlytics , возможно, не сможет найти связанныеBuildId
s. Мы рекомендуем вам рассмотреть возможность использования стандартного расположения общих библиотек.Убедитесь, что вы не удаляете
BuildId
во время процесса сборки.Обратите внимание, что следующие советы по устранению неполадок применимы как к ошибкам ANR, так и к собственным сбоям.
Проверьте, существуют ли
BuildId
, запустивreadelf -n
в ваших двоичных файлах. ЕслиBuildId
отсутствуют, добавьте-Wl,--build-id
к флагам вашей системы сборки.Убедитесь, что вы случайно не удаляете
BuildId
, пытаясь уменьшить размер APK.Если вы храните удаленные и неразделенные версии библиотеки, обязательно укажите правильную версию в своем коде.
Между количеством ошибок ANR в Google Play и Crashlytics может быть несоответствие. Это ожидаемо из-за разницы в механизме сбора и предоставления данных ANR. Crashlytics сообщает об ошибках ANR при следующем запуске приложения, тогда как Android Vitals отправляет данные ANR после возникновения ошибки ANR.
Кроме того, Crashlytics отображает только ошибки ANR, возникающие на устройствах под управлением Android 11+, в отличие от Google Play, который отображает ошибки ANR с устройств со службами Google Play и принятым согласием на сбор данных.
Цепочки инструментов 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 v3.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
Если вы видите следующее исключение, скорее всего, вы используете версию DexGuard, несовместимую с Firebase Crashlytics SDK:
java.lang.IllegalArgumentException: Transport backend 'cct' is not registered
Это исключение не приводит к сбою вашего приложения, но не позволяет ему отправлять отчеты о сбоях. Чтобы это исправить:
Убедитесь, что вы используете последнюю версию DexGuard 8.x. Последняя версия содержит правила, необходимые для Firebase Crashlytics SDK.
Если вы не хотите менять версию DexGuard, попробуйте добавить следующую строку в правила обфускации (в файле конфигурации DexGuard):
-keepresourcexmlelements manifest/application/service/meta-data@value=cct
Когда приложение использует обфускатор, который не раскрывает расширение файла, Crashlytics по умолчанию генерирует каждую проблему с расширением файла .java
.
Чтобы Crashlytics мог генерировать проблемы с правильным расширением файла, убедитесь, что ваше приложение использует следующую настройку:
- Использует Android Gradle 4.2.0 или выше.
- Использует R8 с включенной обфускацией. Чтобы обновить приложение до R8, следуйте этой документации .
Обратите внимание, что после обновления описанной выше настройки вы можете начать видеть новые проблемы .kt
, которые являются дубликатами существующих проблем .java
. См. FAQ , чтобы узнать больше об этом обстоятельстве.
Начиная с середины декабря 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
.
Примечания позволяют участникам проекта комментировать конкретные проблемы с помощью вопросов, обновлений статуса и т. д.
Когда участник проекта публикует заметку, она помечается адресом электронной почты его учетной записи Google. Этот адрес электронной почты вместе с заметкой виден всем участникам проекта, имеющим доступ для просмотра заметки.
Ниже описан доступ, необходимый для просмотра, записи и удаления заметок:
Участники проекта с любой из следующих ролей могут просматривать и удалять существующие заметки, а также писать новые заметки по проблеме.
Участники проекта с любой из следующих ролей могут просматривать заметки, опубликованные по проблеме, но не могут удалять или писать заметки.
Интеграции
Если ваш проект использует Crashlytics вместе с Google Mobile Ads SDK, вполне вероятно, что генераторы отчетов о сбоях мешают регистрировать обработчики исключений. Чтобы устранить эту проблему, отключите отчеты о сбоях в Mobile Ads SDK, вызвав метод disableSDKCrashReporting
.
После того как вы свяжете Crashlytics с BigQuery, новые создаваемые вами наборы данных автоматически располагаются в США, независимо от местоположения вашего проекта Firebase.
Поддержка платформы
Firebase Crashlytics NDK не поддерживает ARMv5 (armeabi). Поддержка этого ABI была удалена начиная с NDK r17.
Регрессирующие проблемы
Проблема была регрессирована, когда вы ранее закрыли ее, но Crashlytics получает новый отчет о том, что проблема повторилась. Crashlytics автоматически повторно открывает эти регрессировавшие проблемы, чтобы вы могли решить их соответствующим образом для вашего приложения.
Вот пример сценария, который объясняет, как Crashlytics классифицирует проблему как регрессию:
- Впервые Crashlytics получает отчет о сбое Crash «A». Crashlytics открывает соответствующую проблему для этого сбоя (проблема «A»).
- Вы быстро исправляете эту ошибку, закрываете проблему «А», а затем выпускаете новую версию своего приложения.
- Crashlytics получит еще один отчет о проблеме «А» после того, как вы ее закроете.
- Если отчет относится к версии приложения, о которой Crashlytics знал, когда вы закрыли проблему (это означает, что версия вообще отправила отчет о сбое при любом сбое), то Crashlytics не будет считать проблему регрессированной. Вопрос останется закрытым.
- Если отчет относится к версии приложения, о которой Crashlytics не знала, когда вы закрыли проблему (это означает, что версия вообще никогда не отправляла отчет о сбое ни при каком сбое), то Crashlytics считает, что проблема регрессировала, и повторно откроет проблему.
Когда проблема регрессирует, мы отправляем предупреждение об обнаружении регрессии и добавляем к проблеме сигнал регрессии, чтобы вы знали, что Crashlytics повторно открыла проблему. Если вы не хотите, чтобы проблема открывалась повторно из-за нашего алгоритма регрессии, «приглушите» проблему, а не закрывайте ее.
Если отчет исходит из старой версии приложения, которая вообще не отправляла никаких отчетов о сбоях, когда вы закрыли проблему, Crashlytics считает, что проблема регрессировала, и повторно откроет проблему.
Такая ситуация может возникнуть в следующей ситуации: вы исправили ошибку и выпустили новую версию своего приложения, но у вас все еще есть пользователи более старых версий без исправления ошибки. Если случайно одна из этих старых версий вообще не отправляла никаких отчетов о сбоях, когда вы закрыли проблему, и эти пользователи начали сталкиваться с ошибкой, то эти отчеты о сбоях вызвали бы регрессирующую проблему.
Если вы не хотите, чтобы проблема открывалась повторно из-за нашего алгоритма регрессии, «приглушите» проблему, а не закрывайте ее.
,На этой странице представлена помощь по устранению неполадок и ответы на часто задаваемые вопросы об использовании Crashlytics . Если вы не можете найти то, что ищете, или вам нужна дополнительная помощь, обратитесь в службу поддержки Firebase .
Общее устранение неполадок/часто задаваемые вопросы
Вы можете заметить два разных формата проблем, перечисленных в таблице «Проблемы» в консоли Firebase . И вы также можете заметить функцию под названием «варианты» в некоторых ваших задачах. Вот почему!
В начале 2023 года мы представили улучшенный механизм анализа для группировки событий, а также обновленный дизайн и некоторые расширенные функции для новых проблем (например, вариантов!). Подробности читайте в нашем недавнем сообщении в блоге , а основные моменты вы можете прочитать ниже.
Crashlytics анализирует все события вашего приложения (например, сбои, нефатальные ошибки и ошибки ANR) и создает группы событий, называемых проблемами — все события в проблеме имеют общую точку сбоя.
Чтобы сгруппировать события по этим проблемам, улучшенный механизм анализа теперь анализирует многие аспекты события, включая кадры в трассировке стека, сообщение об исключении, код ошибки и другие характеристики платформы или типа ошибки.
Однако в этой группе событий трассировки стека, приводящие к сбою, могут быть разными. Другая трассировка стека может означать другую основную причину. Чтобы представить эту возможную разницу внутри проблемы, мы теперь создаем варианты внутри задач — каждый вариант представляет собой подгруппу событий в задаче, которые имеют одну и ту же точку отказа и аналогичную трассировку стека. С помощью вариантов вы можете отладить наиболее распространенные трассировки стека внутри проблемы и определить, приводят ли к сбою различные основные причины.
Вот что вы получите благодаря этим улучшениям:
Обновленные метаданные, отображаемые в строке проблемы.
Теперь стало проще понимать и сортировать проблемы в вашем приложении.Меньше повторяющихся проблем
Изменение номера строки не приводит к возникновению новой проблемы.Упрощенная отладка сложных проблем с различными первопричинами.
Используйте варианты для отладки наиболее распространенных трассировок стека в задаче.Более содержательные оповещения и сигналы
Новая проблема на самом деле представляет собой новую ошибку.Более мощный поиск
Каждая проблема содержит больше метаданных, доступных для поиска, таких как тип исключения и имя пакета.
Вот как эти улучшения реализуются:
Когда мы получаем новые события из вашего приложения, мы проверяем, соответствуют ли они существующей проблеме.
Если совпадений нет, мы автоматически применим к событию наш более умный алгоритм группировки событий и создадим новую проблему с обновленным дизайном метаданных.
Это первое большое обновление, которое мы вносим в нашу группу событий. Если у вас есть отзывы или возникли какие-либо проблемы, сообщите нам об этом, отправив отчет.
Если вы не видите навигационные журналы , рекомендуем проверить конфигурацию вашего приложения для Google Analytics . Убедитесь, что вы соответствуете следующим требованиям:
Вы включили Google Analytics в своем проекте Firebase.
Вы включили обмен данными для Google Analytics . Подробнее об этом параметре читайте в разделе «Управление настройками общего доступа к данным Google Analytics».
У тебя естьдобавлен Firebase SDK для Google Analyticsв ваше приложение. Этот SDK необходимо добавить в дополнение к Crashlytics SDK.
Вы используетепоследние версии Firebase SDKдля всех продуктов, которые вы используете в своем приложении.
Особенно убедитесь, что вы используете как минимум следующую версию Firebase SDK для Google Analytics :
Android — v17.2.3+ ( BoM v24.7.1+).
Если вы не видите оповещения о скорости, убедитесь, что вы используетеCrashlytics SDK v18.6.0+ (или Firebase BoM v32.6.0+).
Если вы не видите показателей отсутствия сбоев (например, пользователей и сеансов без сбоев) или видите ненадежные показатели, проверьте следующее:
Убедитесь, что вы используетеCrashlytics SDK v18.6.0+ (или Firebase BoM v32.6.0+).
Убедитесь, что настройки сбора данных не влияют на качество показателей безотказности:
Если вы включите возможность создания отчетов о сбоях, отключив автоматические отчеты о сбоях, информация о сбоях может быть отправлена в Crashlytics только от пользователей, которые явно согласились на сбор данных. Таким образом, это повлияет на точность показателей отсутствия сбоев, поскольку Crashlytics собирает информацию о сбоях только от этих согласившихся пользователей (а не от всех ваших пользователей). Это означает, что ваши показатели отсутствия сбоев могут быть менее надежными и менее отражающими общую стабильность вашего приложения.
Если у вас отключен автоматический сбор данных, вы можете использовать
sendUnsentReports
для отправки кэшированных отчетов на устройстве в Crashlytics . При использовании этого метода в Crashlytics будут отправляться данные о сбоях , но не данные сеансов , из-за чего на диаграммах консоли будут отображаться низкие или нулевые значения для показателей без сбоев.
См. раздел Общие сведения о показателях отсутствия сбоев .
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 v2.9.4+
Проверьте, не используете ли вы нестандартное расположение для своих общих библиотек.
Если вам не хватает только
BuildId
для общих библиотек вашего приложения, вполне вероятно, что вы не используете стандартное расположение по умолчанию для общих библиотек. В этом случае Crashlytics , возможно, не сможет найти связанныеBuildId
s. Мы рекомендуем вам рассмотреть возможность использования стандартного местоположения для общих библиотек.Убедитесь, что вы не снимаете
BuildId
S в процессе сборки.Обратите внимание, что следующие советы по устранению неполадок применяются как к ANRS, так и к местным сбоям.
Проверьте, существует ли
BuildId
, запустивreadelf -n
на ваших двоичных файлах. ЕслиBuildId
S отсутствует, то добавьте-Wl,--build-id
на флаги для вашей системы сборки.Убедитесь, что вы не непреднамеренно снимаете
BuildId
S, чтобы уменьшить размер APK.Если вы сохраняете разряженные и не подвергнутые резкости версии библиотеки, обязательно укажите на правильную версию в вашем коде.
Может быть несоответствие между подсчетом ANRS между Google Play и Crashlytics . Это ожидается из -за разницы в механизме сбора и сообщения данных ANR. Crashlytics сообщает ANRS, когда приложение дальше начинается, тогда как Android Vitals отправляет данные ANR после того, как произойдет ANR.
Кроме того, Crashlytics отображает только ANR, которые встречаются на устройствах под управлением Android 11+, по сравнению с Google Play, который отображает ANR из устройств с принятыми службами Google Play и согласия сбора данных.
Инструменты LLVM и GNU имеют четкие значения по умолчанию и обработки для сегмента двоичных файлов вашего приложения только для чтения, которые могут генерировать противоречивые следы стека на консоли Firebase . Чтобы смягчить это, добавьте следующие флаги линкера в процесс сборки:
Если вы используете линкеров
lld
из инструментального оборудования LLVM, добавьте:-Wl,--no-rosegment
Если вы используете линкеров
ld.gold
из инструментального оборудования GNU, добавьте:-Wl,--rosegment
Если вы все еще видите несоответствия трассировки стека (или, если ни один флаг не имеет отношения к вашему инструментальной школе), попробуйте добавить следующее в процесс сборки:
-fno-omit-frame-pointer
Плагин Crashlytics объединяет настраиваемый генератор файлов символов для перерыва . Если вы предпочитаете использовать свой собственный двоичный файл для генерации файлов символов Breakpad (например, если вы предпочитаете создавать все собственные исполняемые файлы в вашей цепочке сборки из источника), используйте необязательное свойство расширения symbolGeneratorBinary
, чтобы указать путь к исполняемому файлу.
Вы можете указать путь к двонатору файлов символов Breakpad в одном из двух способов:
Вариант 1 : Укажите путь через расширение
firebaseCrashlytics
в вашем файлеbuild.gradle
Добавьте следующее в файл вашего уровня на уровне приложения
build.gradle.kts
:Градл плагин v3.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
Если вы видите следующее исключение, то, вероятно, вы используете версию DexGuard, которая несовместима с Firebase Crashlytics SDK:
java.lang.IllegalArgumentException: Transport backend 'cct' is not registered
Это исключение не сбивает ваше приложение, но не позволяет ему отправлять отчеты о сбоях. Чтобы исправить это:
Убедитесь, что вы используете последний релиз DexGuard 8.x. Последняя версия содержит правила, требуемые Firebase Crashlytics SDK.
Если вы не хотите менять версию DexGuard, попробуйте добавить следующую строку в свои правила запутывания (в вашем файле конфигурации DexGuard):
-keepresourcexmlelements manifest/application/service/meta-data@value=cct
Когда в приложении используется сфускатор, который не выявляет расширение файла, Crashlytics генерирует каждую проблему с расширением файла .java
по умолчанию.
Таким образом, Crashlytics может генерировать проблемы с правильным расширением файла, убедитесь, что ваше приложение использует следующую настройку:
- Использует Android Gradle 4.2.0 или выше
- Использует R8 с запутанным включенным. Чтобы обновить ваше приложение до R8, следуйте этой документации .
Обратите внимание, что после обновления настройки, описанной выше, вы можете начать видеть новые проблемы .kt
, которые являются дубликатами существующих проблем .java
. Смотрите FAQ , чтобы узнать больше об этом обстоятельстве.
Начиная с середины декабря 2021 года, Crashlytics улучшила поддержку приложений, которые используют Kotlin.
До недавнего времени доступные сфуссаторы не выявляли расширение файла, поэтому Crashlytics сгенерировал каждую проблему с расширением файла .java
по умолчанию. Однако, как и Android Gradle 4.2.0, R8 поддерживает расширения файлов.
С помощью этого обновления Crashlytics теперь может определить, записан ли каждый класс в приложении в котлине, и включать правильное имя файла в подписи выпуска. Сборы теперь правильно приписываются файлам .kt
(в зависимости от необходимости), если в вашем приложении есть следующая настройка:
- Ваше приложение использует Android Gradle 4.2.0 или выше.
- Ваше приложение использует R8 с включенным запутыванием.
Поскольку новые сбои теперь включают в себя правильное расширение файлов в их подписи выпуска, вы можете увидеть новые проблемы .kt
, которые на самом деле являются просто дубликатами .java
проблем. В консоли Firebase мы пытаемся идентифицировать и сообщить вам, если новый вопрос .kt
является возможной дубликацией существующей проблемы .java
.
Примечания позволяют участникам проекта комментировать конкретные вопросы с вопросами, обновлениями статуса и т. Д.
Когда участник проекта публикует заметку, она помечена электронной почтой их учетной записи Google. Этот адрес электронной почты видна, наряду с примечанием для всех участников проекта с доступом для просмотра примечания.
Следующее описывает доступ, необходимый для просмотра, записи и удаления примечаний:
Члены проекта с любой из следующих ролей могут просмотреть и удалять существующие заметки и писать новые заметки по вопросу.
Члены проекта с любыми из следующих ролей могут просмотреть заметки, опубликованные по вопросу, но они не могут удалить или написать заметку.
- Зритель проекта, зритель Firebase , качественный просмотр или Crashlytics Viewer
Интеграции
Если ваш проект использует Crashlytics вместе с SDK Google Mobile Ads , вполне вероятно, что репортеры с аварией вмешиваются при регистрации обработчиков исключений. Чтобы решить проблему, отключите отчеты о сбоях в Mobile Ads SDK, позвонив в disableSDKCrashReporting
.
После того, как вы связываете Crashlytics с BigQuery, новые наборы данных, которые вы создаете, автоматически расположены в Соединенных Штатах, независимо от места вашего проекта Firebase.
Поддержка платформы
Firebase Crashlytics NDK не поддерживает ARMV5 (Armeabi). Поддержка этого ABI была удалена с NDK R17.
Регрессивные проблемы
Вопрос возникла регрессия, когда вы ранее закрыли проблему, но Crashlytics получает новый отчет о том, что проблема повторно зарегистрировалась. Crashlytics автоматически вновь открывает эти регрессивные проблемы, чтобы вы могли решать их как необходимые для вашего приложения.
Вот пример сценария, в котором объясняется, как Crashlytics классифицирует проблему как регрессию:
- Впервые Crashlytics получает отчет о аварии о Crash "A". Crashlytics открывает соответствующую проблему для этого сбоя (выпуск «a»).
- Вы быстро исправляете эту ошибку, закрываете проблему «A», а затем выпускаете новую версию вашего приложения.
- Crashlytics получает еще один отчет о выпуске «A» после того, как вы закрыли проблему.
- Если отчет взят из версии приложения, о которой Crashlytics знал, когда вы закрыли проблему (это означает, что версия отправила отчет о сбое для любого сбоя), то Crashlytics не рассматривает эту проблему как регрессированную. Проблема останется закрытой.
- Если отчет взят из версии приложения, о которой Crashlytics не знал о том, когда вы закрыли проблему (это означает, что версия никогда не отправляла никакого отчета о сбое для какого-либо сбоя), то Crashlytics рассматривает вопрос об регрессивности и повторно откроет проблему.
Когда проблема регрессирует, мы посылаем оповещение о обнаружении регрессии и добавляем сигнал регрессии в проблему, чтобы вы знали, что Crashlytics вновь открыла проблему. Если вы не хотите, чтобы проблема была вновь открыта из-за нашего алгоритма регрессии, «отключить» проблему вместо того, чтобы закрыть ее.
Если отчет взят из старой версии приложения, которая вообще никогда не отправляла отчеты о сбоях, когда вы закрыли проблему, то Crashlytics рассматривает проблему, регрессирующая и вновь откроет проблему.
Эта ситуация может произойти в следующей ситуации: вы исправили ошибку и выпустили новую версию вашего приложения, но у вас все еще есть пользователи на старых версиях без исправления ошибки. Если случайно одна из этих старых версий никогда не отправляла никаких отчетов о сбоях вообще, когда вы закрыли проблему, и эти пользователи начинают встречаться с ошибкой, то эти отчеты об аварии вызывают регрессивную проблему.
Если вы не хотите, чтобы проблема была вновь открыта из-за нашего алгоритма регрессии, «отключить» проблему вместо того, чтобы закрыть ее.
,На этой странице предоставлена помощь и ответы на часто заданные вопросы об использовании Crashlytics . Если вы не можете найти то, что ищете, или нужна дополнительная помощь, свяжитесь с поддержкой Firebase .
Общие устранения неполадок/FAQ
Вы можете заметить два разных формата для проблем, перечисленных в вашей таблице проблем в консоли Firebase . И вы также можете заметить функцию, называемую «варианты» в некоторых ваших проблемах. Вот почему!
В начале 2023 года мы развернули улучшенный механизм анализа для группировки событий, а также обновленный дизайн и некоторые расширенные функции для новых проблем (например, варианты!). Проверьте наше недавнее сообщение в блоге для всех деталей, но вы можете прочитать ниже для основных моментов.
Crashlytics анализирует все события из вашего приложения (например, аварии, не жидкие и ANR) и создает группы событий, называемые вопросами -все события в проблеме имеют общую точку отказа.
Чтобы группировать события в эти проблемы, улучшенный механизм анализа теперь рассматривает многие аспекты события, включая кадры в трассировке стека, сообщение об исключении, код ошибки и другие характеристики типа ошибки.
Однако в рамках этой группы событий следы стека, ведущие к сбою, могут быть разными. Другой трассировку стека может означать другую основную причину. Чтобы представить эту возможную разницу в проблеме, мы теперь создаем варианты в рамках вопросов - каждый вариант является подгруппой событий в проблеме, которая имеет одинаковую точку отказа и аналогичную трассу стека. С вариантами вы можете отлаживать наиболее распространенные трассы стека в рамках проблемы и определить, приводят ли различные основные причины к сбое.
Вот что вы испытаете с этими улучшениями:
Обновленные метаданные, отображаемые в строке выпуска
Теперь в вашем приложении легче понять и сортировать проблемы.Меньше дубликатов проблем
Изменение номера строки не приводит к новой проблеме.Более легкая отладка сложных проблем с различными коренными причинами
Используйте варианты, чтобы отлаживать наиболее распространенные следы стека в рамках проблемы.Более значимые оповещения и сигналы
Новая проблема на самом деле представляет новую ошибку.Более мощный поиск
Каждый выпуск содержит больше метаданных для поиска, таких как тип исключения и имя пакета.
Вот как эти улучшения развернуты:
Когда мы получим новые события из вашего приложения, мы проверим, соответствуют ли они существующей проблеме.
Если нет совпадения, мы автоматически применим наш более умный алгоритм групп событий на мероприятие и создадим новую проблему с обновленным дизайном метаданных.
Это первое большое обновление, которое мы делаем для нашей группировки мероприятий. Если у вас есть обратная связь или столкнуться с какими -либо проблемами, сообщите нам об этом, подав отчет.
Если вы не видите журналов Breadcrumb , мы рекомендуем проверить конфигурацию вашего приложения для Google Analytics . Убедитесь, что вы выполнили следующие требования:
Вы включили Google Analytics в своем проекте Firebase.
Вы включили обмен данными для Google Analytics . Узнайте больше об этом настройке в управлении настройками обмена данными аналитики
У тебя естьДобавлена Firebase SDK для Google Analyticsк вашему приложению. Этот SDK должен быть добавлен в дополнение к Crashlytics SDK.
Вы используетеПоследние версии Firebase SDKДля всех продуктов, которые вы используете в своем приложении.
Особенно проверьте, что вы используете как минимум следующую версию Firebase SDK для Google Analytics :
Android - V17.2.3+ ( BoM V24.7.1+).
Если вы не видите оповещения о скорости, убедитесь, что вы используетеCrashlytics SDK V18.6.0+ (или Firebase BoM V32.6.0+).
Если вы не видите без сбоев метрик (например, пользователи и сеансы без сбоев) или видите ненадежные метрики, проверьте следующее:
Убедитесь, что вы используетеCrashlytics SDK V18.6.0+ (или Firebase BoM V32.6.0+).
Убедитесь, что настройки сбора данных не влияют на качество ваших метрик без сбоев:
Если вы включите отчетность, отключив автоматическую отчетность по сбою, информация о сбое может быть отправлена только в Crashlytics от пользователей, которые явно выбрали сбор данных. Таким образом, на точность метриков без сбоев будет затронута, поскольку Crashlytics имеет информацию о сбоях от этих пользователей (а не всех ваших пользователей). Это означает, что ваши непревзойденные показатели могут быть менее надежными и менее отражающими общую стабильность вашего приложения.
Если у вас отключен автоматический сбор данных, вы можете использовать
sendUnsentReports
для отправки Crashlytics отчетов на устройстве. Использование этого метода отправит данные о сбое в Crashlytics , но не данные о сеансах , которые приводят к тому, что консольные диаграммы показывают низкие или нулевые значения для метрик без сбоев.
См. Понятно, без сбоев метрик .
Crashlytics поддерживает отчеты ANR для приложений Android с устройств, которые запускают Android 11 и выше. Основной API, который мы используем для сбора ANR ( GethistoricalProcessExitreasons ), более надежна, чем подходы Sigquit или на стороне. Этот API доступен только на устройствах Android 11+.
Если некоторые из ваших ANR не пропускают свои BuildId
, устранение неполадок следующим образом:
Убедитесь, что вы используете современную Crashlytics Android SDK и версию плагина Crashlytics Gradle.
Если вам не хватает
BuildId
S для Android 11 и некоторых Android 12 ANR, то вполне вероятно, что вы используете устаревший SDK, плагин Gradle или обоих. Чтобы правильно собратьBuildId
для этих ANR, вам необходимо использовать следующие версии:- Crashlytics Android SDK V18.3.5+ ( Firebase BoM V31.2.2+)
- Crashlytics плагин Gradle gradle v2.9.4+
Проверьте, используете ли вы нестандартное место для ваших общих библиотек.
Если вам не хватает
BuildId
S для общих библиотек вашего приложения, вполне вероятно, что вы не используете стандартное местоположение по умолчанию для общих библиотек. Если это так, то Crashlytics возможно, не сможет найти связанныеBuildId
. Мы рекомендуем вам рассмотреть возможность использования стандартного местоположения для общих библиотек.Убедитесь, что вы не снимаете
BuildId
S в процессе сборки.Обратите внимание, что следующие советы по устранению неполадок применяются как к ANRS, так и к местным сбоям.
Проверьте, существует ли
BuildId
, запустивreadelf -n
на ваших двоичных файлах. ЕслиBuildId
S отсутствует, то добавьте-Wl,--build-id
на флаги для вашей системы сборки.Убедитесь, что вы не непреднамеренно снимаете
BuildId
S, чтобы уменьшить размер APK.Если вы сохраняете разряженные и не подвергнутые резкости версии библиотеки, обязательно укажите на правильную версию в вашем коде.
Может быть несоответствие между подсчетом ANRS между Google Play и Crashlytics . Это ожидается из -за разницы в механизме сбора и сообщения данных ANR. Crashlytics сообщает ANRS, когда приложение дальше начинается, тогда как Android Vitals отправляет данные ANR после того, как произойдет ANR.
Кроме того, Crashlytics отображает только ANR, которые встречаются на устройствах под управлением Android 11+, по сравнению с Google Play, который отображает ANR из устройств с принятыми службами Google Play и согласия сбора данных.
Инструменты LLVM и GNU имеют четкие значения по умолчанию и обработки для сегмента двоичных файлов вашего приложения только для чтения, которые могут генерировать противоречивые следы стека на консоли Firebase . Чтобы смягчить это, добавьте следующие флаги линкера в процесс сборки:
Если вы используете линкеров
lld
из инструментального оборудования LLVM, добавьте:-Wl,--no-rosegment
Если вы используете линкеров
ld.gold
из инструментального оборудования GNU, добавьте:-Wl,--rosegment
Если вы все еще видите несоответствия трассировки стека (или, если ни один флаг не имеет отношения к вашему инструментальной школе), попробуйте добавить следующее в процесс сборки:
-fno-omit-frame-pointer
Плагин Crashlytics объединяет настраиваемый генератор файлов символов для перерыва . Если вы предпочитаете использовать свой собственный двоичный файл для генерации файлов символов Breakpad (например, если вы предпочитаете создавать все собственные исполняемые файлы в вашей цепочке сборки из источника), используйте необязательное свойство расширения symbolGeneratorBinary
, чтобы указать путь к исполняемому файлу.
Вы можете указать путь к двонатору файлов символов Breakpad в одном из двух способов:
Вариант 1 : Укажите путь через расширение
firebaseCrashlytics
в вашем файлеbuild.gradle
Добавьте следующее в файл вашего уровня на уровне приложения
build.gradle.kts
:Градл плагин v3.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
Если вы видите следующее исключение, то, вероятно, вы используете версию DexGuard, которая несовместима с Firebase Crashlytics SDK:
java.lang.IllegalArgumentException: Transport backend 'cct' is not registered
Это исключение не сбивает ваше приложение, но не позволяет ему отправлять отчеты о сбоях. Чтобы исправить это:
Убедитесь, что вы используете последний релиз DexGuard 8.x. Последняя версия содержит правила, требуемые Firebase Crashlytics SDK.
Если вы не хотите менять версию DexGuard, попробуйте добавить следующую строку в свои правила запутывания (в вашем файле конфигурации DexGuard):
-keepresourcexmlelements manifest/application/service/meta-data@value=cct
Когда в приложении используется сфускатор, который не выявляет расширение файла, Crashlytics генерирует каждую проблему с расширением файла .java
по умолчанию.
Таким образом, Crashlytics может генерировать проблемы с правильным расширением файла, убедитесь, что ваше приложение использует следующую настройку:
- Использует Android Gradle 4.2.0 или выше
- Использует R8 с запутанным включенным. Чтобы обновить ваше приложение до R8, следуйте этой документации .
Обратите внимание, что после обновления настройки, описанной выше, вы можете начать видеть новые проблемы .kt
, которые являются дубликатами существующих проблем .java
. Смотрите FAQ , чтобы узнать больше об этом обстоятельстве.
Начиная с середины декабря 2021 года, Crashlytics улучшила поддержку приложений, которые используют Kotlin.
До недавнего времени доступные сфуссаторы не выявляли расширение файла, поэтому Crashlytics сгенерировал каждую проблему с расширением файла .java
по умолчанию. Однако, как и Android Gradle 4.2.0, R8 поддерживает расширения файлов.
С помощью этого обновления Crashlytics теперь может определить, записан ли каждый класс в приложении в котлине, и включать правильное имя файла в подписи выпуска. Сборы теперь правильно приписываются файлам .kt
(в зависимости от необходимости), если в вашем приложении есть следующая настройка:
- Ваше приложение использует Android Gradle 4.2.0 или выше.
- Ваше приложение использует R8 с включенным запутыванием.
Поскольку новые сбои теперь включают в себя правильное расширение файлов в их подписи выпуска, вы можете увидеть новые проблемы .kt
, которые на самом деле являются просто дубликатами .java
проблем. В консоли Firebase мы пытаемся идентифицировать и сообщить вам, если новый вопрос .kt
является возможной дубликацией существующей проблемы .java
.
Notes allow project members to comment on specific issues with questions, status updates, etc.
When a project member posts a note, it's labeled with the email of their Google account. This email address is visible, along with the note, to all project members with access to view the note.
The following describes the access required to view, write, and delete notes:
Project members with any of the following roles can view and delete existing notes and write new notes on an issue.
- Project Owner or Editor , Firebase Admin , Quality Admin , or Crashlytics Admin
Project members with any of the following roles can view the notes posted on an issue, but they cannot delete or write a note.
- Project Viewer , Firebase Viewer , Quality Viewer , or Crashlytics Viewer
Интеграции
If your project uses Crashlytics alongside the Google Mobile Ads SDK, it's likely that the crash reporters are interfering when registering exception handlers. To fix the issue, turn off crash reporting in the Mobile Ads SDK by calling disableSDKCrashReporting
.
After you link Crashlytics to BigQuery, new datasets you create are automatically located in the United States, regardless of the location of your Firebase project.
Platform support
The Firebase Crashlytics NDK does not support ARMv5 (armeabi). Support for this ABI was removed as of NDK r17.
Regressed issues
An issue has had a regression when you've previously closed the issue but Crashlytics gets a new report that the issue has re-occurred. Crashlytics automatically re-opens these regressed issues so that you can address them as appropriate for your app.
Here's an example scenario that explains how Crashlytics categorizes an issue as a regression:
- For the first time ever, Crashlytics gets a crash report about Crash "A". Crashlytics opens a corresponding issue for that crash (Issue "A").
- You fix this bug quickly, close Issue "A", and then release a new version of your app.
- Crashlytics gets another report about Issue "A" after you've closed the issue.
- If the report is from an app version that Crashlytics knew about when you closed the issue (meaning that the version had sent a crash report for any crash at all), then Crashlytics won't consider the issue as regressed. The issue will remain closed.
- If the report is from an app version that Crashlytics did not know about when you closed the issue (meaning that the version had never sent any crash report for any crash at all), then Crashlytics considers the issue regressed and will re-open the issue.
When an issue regresses, we send a regression detection alert and add a regression signal to the issue to let you know that Crashlytics has re-opened the issue. If you do not want an issue to re-open due to our regression algorithm, "mute" the issue instead of closing it.
If a report is from an old app version that had never sent any crash reports at all when you closed the issue, then Crashlytics considers the issue regressed and will re-open the issue.
This situation can happen in the following situation: You've fixed a bug and released a new version of your app, but you still have users on older versions without the bug fix. If, by chance, one of those older versions had never sent any crash reports at all when you closed the issue, and those users start encountering the bug, then those crash reports would trigger a regressed issue.
If you do not want an issue to re-open due to our regression algorithm, "mute" the issue instead of closing it.
,This page provides troubleshooting help and answers to frequently-asked questions about using Crashlytics . If you can't find what you're looking for or need additional help, contact Firebase support .
General troubleshooting/FAQ
You might notice two different formats for issues listed in your Issues table in the Firebase console. And you might also notice a feature called "variants" within some of your issues. Вот почему!
In early 2023, we rolled out an improved analysis engine for grouping events as well as an updated design and some advanced features for new issues (like variants!). Check out our recent blog post for all the details, but you can read below for the highlights.
Crashlytics analyzes all the events from your app (like crashes, non-fatals, and ANRs) and creates groups of events called issues — all events in an issue have a common point of failure.
To group events into these issues, the improved analysis engine now looks at many aspects of the event, including the frames in the stack trace, the exception message, the error code, and other platform or error type characteristics.
However, within this group of events, the stack traces leading to the failure might be different. A different stack trace could mean a different root cause. To represent this possible difference within an issue, we now create variants within issues - each variant is a sub-group of events in an issue that have the same failure point and a similar stack trace. With variants, you can debug the most common stack traces within an issue and determine if different root causes are leading to the failure.
Here's what you'll experience with these improvements:
Revamped metadata displayed within the issue row
It's now easier to understand and triage issues in your app.Fewer duplicate issues
A line number change doesn't result in a new issue.Easier debugging of complex issues with various root causes
Use variants to debug the most common stack traces within an issue.More meaningful alerts and signals
A new issue actually represents a new bug.More powerful search
Each issue contains more searchable metadata, like exception type and package name.
Here's how these improvements are rolling out:
When we get new events from your app, we'll check if they match to an existing issue.
If there's no match, we'll automatically apply our smarter event-grouping algorithm to the event and create a new issue with the revamped metadata design.
This is the first big update that we're making to our event grouping. If you have feedback or encounter any issues, please let us know by filing a report.
If you're not seeing breadcrumb logs , we recommend checking your app's configuration for Google Analytics . Make sure you meet the following requirements:
You've enabled Google Analytics in your Firebase project.
You've enabled Data sharing for Google Analytics . Learn more about this setting in Manage your Analytics data sharing settings
У тебя естьadded the Firebase SDK for Google Analyticsto your app. This SDK must be added in addition to the Crashlytics SDK.
You're using thelatest Firebase SDK versionsfor all the products that you use in your app.
Especially check that you're using at minimum the following version of the Firebase SDK for Google Analytics :
Android — v17.2.3+ ( BoM v24.7.1+) .
If you're not seeing velocity alerts, make sure that you're using theCrashlytics SDK v18.6.0+ (or Firebase BoM v32.6.0+).
If you're not seeing crash-free metrics (like crash-free users and sessions) or seeing unreliable metrics, check the following:
Make sure that you're using theCrashlytics SDK v18.6.0+ (or Firebase BoM v32.6.0+).
Make sure that your data collection settings aren't impacting the quality of your crash-free metrics:
If you enable opt-in reporting by disabling automatic crash reporting, crash information can only be sent to Crashlytics from users who have explicitly opted into data collection. Thus, the accuracy of crash-free metrics will be affected since Crashlytics only has crash information from these opted-in users (rather than all your users). This means that your crash-free metrics may be less reliable and less reflective of the overall stability of your app.
If you have automatic data collection disabled, you can use
sendUnsentReports
to send on-device cached reports to Crashlytics . Using this method will send crash data to Crashlytics , but not sessions data which causes the console charts to show low or zero values for crash-free metrics.
See Understand crash-free metrics .
Crashlytics supports ANR reporting for Android apps from devices that run Android 11 and higher. The underlying API that we use to collect ANRs ( getHistoricalProcessExitReasons ) is more reliable than SIGQUIT or watchdog-based approaches. This API is available only on Android 11+ devices.
If some of your ANRs are missing their BuildId
s, troubleshoot as follows:
Make sure that you're using an up-to-date Crashlytics Android SDK and Crashlytics Gradle plugin version.
If you're missing
BuildId
s for Android 11 and some Android 12 ANRs, then it's likely that you're using an out-of-date SDK, Gradle plugin, or both. To properly collectBuildId
s for these ANRs, you need to use the following versions:- Crashlytics Android SDK v18.3.5+ ( Firebase BoM v31.2.2+)
- Crashlytics Gradle plugin v2.9.4+
Check if you're using a non-standard location for your shared libraries.
If you're only missing
BuildId
s for your app's shared libraries, it's likely that you're not using the standard, default location for shared libraries. If this is the case, then Crashlytics might not be able to locate the associatedBuildId
s. We recommend that you consider using the standard location for shared libraries.Make sure that you're not stripping
BuildId
s during the build process.Note that the following troubleshooting tips apply to both ANRs and native crashes.
Check if the
BuildId
s exist by runningreadelf -n
on your binaries. If theBuildId
s are absent, then add-Wl,--build-id
to the flags for your build system.Check that you're not unintentionally stripping the
BuildId
s in an effort to reduce your APK size.If you keep stripped and unstripped versions of a library, make sure to point to the correct version in your code.
There can be a mismatch between the count of ANRs between Google Play and Crashlytics . This is expected due to the difference in the mechanism of collecting and reporting ANR data. Crashlytics reports ANRs when the app next starts up, whereas Android Vitals sends ANR data after the ANR occurs.
Additionally, Crashlytics only displays ANRs that occur on devices running Android 11+, compared to Google Play which displays ANRs from devices with Google Play services and data collection consent accepted.
LLVM and GNU toolchains have distinct defaults and treatments for the read-only segment of your app's binaries, which may generate inconsistent stack traces in the Firebase console. To mitigate this, add the following linker flags to your build process:
If you're using the
lld
linker from the LLVM toolchain, add:-Wl,--no-rosegment
If you're using the
ld.gold
linker from the GNU toolchain, add:-Wl,--rosegment
If you're still seeing stack trace inconsistencies (or if neither flag is pertinent to your toolchain), try adding the following to your build process instead:
-fno-omit-frame-pointer
The Crashlytics plugin bundles a customized Breakpad symbol file generator . If you prefer to use your own binary for generating Breakpad symbol files (for example, if you prefer to build all native executables in your build chain from source), use the optional symbolGeneratorBinary
extension property to specify the path to the executable.
You can specify the path to the Breakpad symbol file generator binary in one of two ways:
Option 1 : Specify the path via the
firebaseCrashlytics
extension in yourbuild.gradle
fileAdd the following to your app-level
build.gradle.kts
file:Gradle plugin v3.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") } } } }
lower plugin versions
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") } } } } }
Option 2 : Specify the path via a property line in your Gradle properties file
You can use the
com.google.firebase.crashlytics.breakpadBinary
property to specify the path to the executable.You can manually update your Gradle properties file or update the file via the command line. For example, to specify the path via the command line, use a command like the following:
./gradlew -Pcom.google.firebase.crashlytics.symbolGenerator=breakpad \ -Pcom.google.firebase.crashlytics.breakpadBinary=/PATH/TO/BREAKPAD/DUMP_SYMS \ app:assembleRelease app:uploadCrashlyticsSymbolFileRelease
If you see the following exception, it's likely you're using a version of DexGuard that's incompatible with the Firebase Crashlytics SDK:
java.lang.IllegalArgumentException: Transport backend 'cct' is not registered
This exception does not crash your app but prevents it from sending crash reports. To fix this:
Make sure you're using the latest DexGuard 8.x release. The latest version contains rules that are required by the Firebase Crashlytics SDK.
If you don't want to change your DexGuard version, try adding the following line to your obfuscation rules (in your DexGuard config file):
-keepresourcexmlelements manifest/application/service/meta-data@value=cct
When an app uses an obfuscator that doesn't expose the file extension, Crashlytics generates each issue with a .java
file extension by default.
So that Crashlytics can generate issues with the correct file extension, make sure your app uses the following setup:
- Uses Android Gradle 4.2.0 or higher
- Uses R8 with obfuscation turned on. To update your app to R8, follow this documentation .
Note that after updating to the setup described above, you might start seeing new .kt
issues that are duplicates of existing .java
issues. See the FAQ to learn more about that circumstance.
Starting in mid-December 2021, Crashlytics improved support for applications that use Kotlin.
Until recently, the available obfuscators did not expose the file extension, so Crashlytics generated each issue with a .java
file extension by default. However, as of Android Gradle 4.2.0, R8 supports file extensions.
With this update, Crashlytics can now determine if each class used within the app is written in Kotlin and include the correct filename in the issue signature. Crashes are now correctly attributed to .kt
files (as appropriate) if your app has the following setup:
- Your app uses Android Gradle 4.2.0 or higher.
- Your app uses R8 with obfuscation turned on.
Since new crashes now include the correct file extension in their issue signatures, you might see new .kt
issues that are actually just duplicates of existing .java
-labeled issues. In the Firebase console, we try to identify and communicate to you if a new .kt
issue is a possible duplicate of an existing .java
-labeled issue.
Notes allow project members to comment on specific issues with questions, status updates, etc.
When a project member posts a note, it's labeled with the email of their Google account. This email address is visible, along with the note, to all project members with access to view the note.
The following describes the access required to view, write, and delete notes:
Project members with any of the following roles can view and delete existing notes and write new notes on an issue.
- Project Owner or Editor , Firebase Admin , Quality Admin , or Crashlytics Admin
Project members with any of the following roles can view the notes posted on an issue, but they cannot delete or write a note.
- Project Viewer , Firebase Viewer , Quality Viewer , or Crashlytics Viewer
Интеграции
If your project uses Crashlytics alongside the Google Mobile Ads SDK, it's likely that the crash reporters are interfering when registering exception handlers. To fix the issue, turn off crash reporting in the Mobile Ads SDK by calling disableSDKCrashReporting
.
After you link Crashlytics to BigQuery, new datasets you create are automatically located in the United States, regardless of the location of your Firebase project.
Platform support
The Firebase Crashlytics NDK does not support ARMv5 (armeabi). Support for this ABI was removed as of NDK r17.
Regressed issues
An issue has had a regression when you've previously closed the issue but Crashlytics gets a new report that the issue has re-occurred. Crashlytics automatically re-opens these regressed issues so that you can address them as appropriate for your app.
Here's an example scenario that explains how Crashlytics categorizes an issue as a regression:
- For the first time ever, Crashlytics gets a crash report about Crash "A". Crashlytics opens a corresponding issue for that crash (Issue "A").
- You fix this bug quickly, close Issue "A", and then release a new version of your app.
- Crashlytics gets another report about Issue "A" after you've closed the issue.
- If the report is from an app version that Crashlytics knew about when you closed the issue (meaning that the version had sent a crash report for any crash at all), then Crashlytics won't consider the issue as regressed. The issue will remain closed.
- If the report is from an app version that Crashlytics did not know about when you closed the issue (meaning that the version had never sent any crash report for any crash at all), then Crashlytics considers the issue regressed and will re-open the issue.
When an issue regresses, we send a regression detection alert and add a regression signal to the issue to let you know that Crashlytics has re-opened the issue. If you do not want an issue to re-open due to our regression algorithm, "mute" the issue instead of closing it.
If a report is from an old app version that had never sent any crash reports at all when you closed the issue, then Crashlytics considers the issue regressed and will re-open the issue.
This situation can happen in the following situation: You've fixed a bug and released a new version of your app, but you still have users on older versions without the bug fix. If, by chance, one of those older versions had never sent any crash reports at all when you closed the issue, and those users start encountering the bug, then those crash reports would trigger a regressed issue.
If you do not want an issue to re-open due to our regression algorithm, "mute" the issue instead of closing it.