Эта страница содержит помощь по устранению неполадок и ответы на часто задаваемые вопросы об использовании Crashlytics . Если вы не нашли то, что искали, или вам нужна дополнительная помощь, обратитесь в службу поддержки Firebase .
Общие вопросы по устранению неполадок/FAQ
Вы могли заметить два разных формата для задач, перечисленных в таблице «Проблемы» в консоли Firebase . Кроме того, в некоторых задачах вы могли заметить функцию под названием «варианты». Вот почему!
В начале 2023 года мы внедрили улучшенный аналитический механизм для группировки событий, а также обновили дизайн и добавили ряд расширенных функций для новых выпусков (например, варианты!). Подробности читайте в нашем недавнем блоге , а ниже вы найдёте самые важные моменты.
Crashlytics анализирует все события вашего приложения (например, сбои, нефатальные ошибки и ANR) и создает группы событий, называемые проблемами . Все события в проблеме имеют общую точку отказа.
Чтобы сгруппировать события по этим проблемам, улучшенный механизм анализа теперь учитывает множество аспектов события, включая кадры в трассировке стека, сообщение об исключении, код ошибки и другие характеристики платформы или типа ошибки.
Однако внутри этой группы событий трассировки стека, приводящие к сбою, могут различаться. Различная трассировка стека может указывать на иную первопричину. Чтобы отразить это возможное различие внутри проблемы, мы теперь создаём варианты внутри проблем: каждый вариант представляет собой подгруппу событий в проблеме, имеющих одну и ту же точку сбоя и схожую трассировку стека. С помощью вариантов можно отладить наиболее распространённые трассировки стека внутри проблемы и определить, приводят ли разные первопричины к сбою.
Вот что вы ощутите благодаря этим улучшениям:
Обновленные метаданные, отображаемые в строке выпуска
Теперь стало проще понимать и решать проблемы в вашем приложении.Меньше повторяющихся проблем
Изменение номера строки не приводит к возникновению новой проблемы.Более простая отладка сложных проблем с различными корневыми причинами
Используйте варианты для отладки наиболее распространенных трассировок стека в рамках проблемы.Более значимые оповещения и сигналы
Новая проблема фактически представляет собой новую ошибку.Более мощный поиск
Каждая проблема содержит больше доступных для поиска метаданных, таких как тип исключения и имя пакета.
Вот как реализуются эти улучшения:
Когда мы получим новые события из вашего приложения, мы проверим, соответствуют ли они существующей проблеме.
Если совпадений нет, мы автоматически применим к событию наш более интеллектуальный алгоритм группировки событий и создадим новую задачу с обновленным дизайном метаданных.
Это первое крупное обновление нашей группы мероприятий. Если у вас есть отзывы или вы столкнулись с какими-либо проблемами, пожалуйста, сообщите нам об этом , отправив отчёт.
Если вы не видите журналы навигации , рекомендуем проверить конфигурацию вашего приложения для Google Analytics . Убедитесь, что выполнены следующие требования:
Вы включили Google Analytics в своем проекте Firebase.
Вы включили совместное использование данных для Google Analytics . Подробнее об этом параметре читайте в статье «Управление настройками совместного использования данных Google Analytics».
У тебя естьдобавил Firebase SDK для Google Analyticsв ваше приложение. Этот SDK необходимо добавить в дополнение к SDK Crashlytics .
Вы используетепоследние версии 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
. Мы рекомендуем вам рассмотреть возможность использования стандартного расположения для общих библиотек.Убедитесь, что вы не удаляете
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 и принятым согласием на сбор данных.
У LLVM и GNU toolchains есть разные значения по умолчанию и способы обработки для сегмента «только для чтения» двоичных файлов вашего приложения, что может приводить к некорректным трассировкам стека в консоли 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
. Подробнее об этом см . в разделе часто задаваемых вопросов .
Начиная с середины декабря 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. Этот адрес электронной почты виден всем участникам проекта, имеющим доступ к просмотру заметки.
Ниже описан доступ, необходимый для просмотра, написания и удаления заметок:
Участники проекта с любой из следующих ролей могут просматривать и удалять существующие заметки, а также писать новые заметки по проблеме.
Участники проекта с любой из следующих ролей могут просматривать заметки, опубликованные по проблеме, но не могут удалять или писать заметки.
- Project Viewer , Firebase Viewer , Quality Viewer или Crashlytics Viewer
Интеграции
Если ваш проект использует Crashlytics вместе с Google Mobile Ads SDK, вероятно, что средства отправки отчётов о сбоях мешают регистрации обработчиков исключений. Чтобы устранить эту проблему, отключите отправку отчётов о сбоях в Mobile Ads SDK, вызвав метод disableSDKCrashReporting
.
После подключения Crashlytics к BigQuery новые создаваемые вами наборы данных автоматически размещаются в США, независимо от местоположения вашего проекта Firebase.
Поддержка платформы
Firebase Crashlytics NDK не поддерживает ARMv5 (armeabi). Поддержка этого ABI прекращена в версии NDK r17.
Регрессивные проблемы
Проблема была решена повторно, и вы уже закрыли её, но Crashlytics получает новый отчёт о её повторном возникновении. Crashlytics автоматически открывает эти регрессивные проблемы, чтобы вы могли устранить их в соответствии с требованиями вашего приложения.
Вот пример сценария, который объясняет, как Crashlytics классифицирует проблему как регрессию:
- Впервые в истории Crashlytics получает отчёт о сбое под номером «A». Crashlytics открывает соответствующую задачу для этой задачи (задача «A»).
- Вы быстро исправляете эту ошибку, закрываете проблему «А», а затем выпускаете новую версию своего приложения.
- Crashlytics получает еще один отчет по проблеме «А» после того, как вы ее закрыли.
- Если отчёт относится к версии приложения, о которой Crashlytics было известно на момент закрытия вами проблемы (то есть эта версия отправила отчёт о любом сбое), то Crashlytics не будет считать проблему регрессивной. Проблема останется закрытой.
- Если отчет получен из версии приложения, о которой Crashlytics не знала на момент закрытия вами вопроса (это означает, что версия вообще не отправляла никаких отчетов об ошибках), то Crashlytics считает проблему регрессировавшей и повторно откроет ее.
Когда проблема регрессирует, мы отправляем оповещение об обнаружении регрессии и добавляем к проблеме сигнал регрессии, чтобы вы знали, что Crashlytics повторно открыл её. Если вы не хотите, чтобы проблема была повторно открыта из-за нашего алгоритма регрессии, «заглушите» её, а не закрывайте.
Если отчет получен из старой версии приложения, которая не отправляла никаких отчетов о сбоях до момента закрытия вами проблемы, то Crashlytics посчитает проблему регрессировавшей и откроет ее повторно.
Такая ситуация может возникнуть в следующей ситуации: вы исправили ошибку и выпустили новую версию приложения, но у вас всё ещё есть пользователи старых версий без исправления ошибки. Если по какой-то причине одна из этих старых версий вообще не отправляла отчёты о сбоях на момент закрытия проблемы, и эти пользователи начнут сталкиваться с ошибкой, то эти отчёты о сбоях приведут к регрессивной проблеме.
Если вы не хотите, чтобы проблема была повторно открыта из-за нашего регрессионного алгоритма, «отключите» проблему вместо ее закрытия.