| Выберите платформу: | iOS+ Android Android NDK Flutter Unity |
Если вы используете нативные библиотеки в своем Android-приложении, вы можете включить полную трассировку стека и подробные отчеты о сбоях для вашего нативного кода из Firebase Crashlytics , внеся несколько небольших изменений в конфигурацию сборки вашего приложения.
В этом руководстве описано, как настроить отчеты о сбоях с помощью SDK Firebase Crashlytics для NDK.
Если вы хотите узнать, как начать работу с Crashlytics в ваших проектах Unity, ознакомьтесь с руководством по началу работы с Unity .
Прежде чем начать
Если вы еще этого не сделали, добавьте Firebase в свой Android-проект. Если у вас нет Android-приложения, вы можете скачать пример приложения .
Рекомендуется : Чтобы автоматически получать навигационные цепочки для анализа действий пользователя, предшествующих сбою, некритическому событию или событию ANR, необходимо включить Google Analytics в вашем проекте Firebase.
При создании нового проекта Firebase включите Google Analytics в процессе создания проекта.
Если вы используете существующий проект Firebase, в котором не включена Google Analytics , вы можете включить её в настройках проекта.
> Страница «Интеграции» в консоли Firebase .
Убедитесь, что ваше приложение соответствует следующим минимально необходимым требованиям:
- Gradle 8.0
- Плагин Android Gradle 8.1.0
- Плагин Gradle для сервисов Google 4.4.1
Шаг 1 : Добавьте Crashlytics SDK для NDK в ваше приложение.
В файле Gradle вашего модуля (уровня приложения) (обычно<project>/<app-module>/build.gradle.kts или <project>/<app-module>/build.gradle ) добавьте зависимость от библиотеки Crashlytics NDK для Android. Мы рекомендуем использовать Firebase Android BoM для управления версиями библиотек.Для оптимальной работы с Crashlytics мы рекомендуем включить Google Analytics в вашем проекте Firebase и добавить Firebase SDK для Google Analytics в ваше приложение.
dependencies { // Import the BoM for the Firebase platform implementation(platform("com.google.firebase:firebase-bom:34.18.0")) // Add the dependencies for the Crashlytics NDK and Analytics libraries // When using the BoM, you don't specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-crashlytics-ndk") implementation("com.google.firebase:firebase-analytics") }
Использование Firebase Android BoM , что ваше приложение всегда будет использовать совместимые версии библиотек Firebase Android.
(Альтернативный вариант) Добавление зависимостей библиотеки Firebase без использования BoM
Если вы решите не использовать Firebase BoM , вам необходимо указать версию каждой библиотеки Firebase в строке зависимости.
Обратите внимание, что если вы используете несколько библиотек Firebase в своем приложении, мы настоятельно рекомендуем использовать BoM для управления версиями библиотек, что гарантирует совместимость всех версий.
dependencies { // Add the dependencies for the Crashlytics NDK and Analytics libraries // When NOT using the BoM, you must specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-crashlytics-ndk:20.1.0") implementation("com.google.firebase:firebase-analytics:23.2.0") }
Шаг 2 : Добавьте плагин Crashlytics Gradle в ваше приложение.
В корневом (проектном) файле Gradle (
<project>/build.gradle.ktsили<project>/build.gradle) добавьте плагин Crashlytics Gradle в блокplugins:Kotlin
plugins { // Make sure that you have the AGP plugin 8.1+ dependency id("com.android.application") version "8.1.4" apply false // ... // Make sure that you have the Google services Gradle plugin 4.4.1+ dependency id("com.google.gms.google-services") version "4.5.0" apply false // Add the dependency for the Crashlytics Gradle plugin id("com.google.firebase.crashlytics") version "3.0.8" apply false }
Groovy
plugins { // Make sure that you have the AGP plugin 8.1+ dependency id 'com.android.application' version '8.1.4' apply false // ... // Make sure that you have the Google services Gradle plugin 4.4.1+ dependency id 'com.google.gms.google-services' version '4.5.0' apply false // Add the dependency for the Crashlytics Gradle plugin id 'com.google.firebase.crashlytics' version '3.0.8' apply false }
В файл Gradle вашего модуля (уровня приложения) (обычно
<project>/<app-module>/build.gradle.ktsили<project>/<app-module>/build.gradle) добавьте плагин Crashlytics Gradle:Kotlin
plugins { id("com.android.application") // ... // Make sure that you have the Google services Gradle plugin id("com.google.gms.google-services") // Add the Crashlytics Gradle plugin id("com.google.firebase.crashlytics") }
Groovy
plugins { id 'com.android.application' // ... // Make sure that you have the Google services Gradle plugin id 'com.google.gms.google-services' // Add the Crashlytics Gradle plugin id 'com.google.firebase.crashlytics' }
Шаг 3 : Добавьте расширение Crashlytics в вашу сборку.
В файле Gradle вашего модуля (уровня приложения) (обычно <project>/<app-module>/build.gradle.kts или <project>/<app-module>/build.gradle ) настройте расширение Crashlytics.
Kotlin
import com.google.firebase.crashlytics.buildtools.gradle.CrashlyticsExtension // ... android { // ... buildTypes { getByName("release") { // Add this extension configure<CrashlyticsExtension> { // Enable processing and uploading of native symbols to Firebase servers. // By default, this is disabled to improve build speeds. // This flag must be enabled to see properly-symbolicated native // stack traces in the Crashlytics dashboard. nativeSymbolUploadEnabled = true } } } }
Groovy
// ... android { // ... buildTypes { release { // Add this extension firebaseCrashlytics { // Enable processing and uploading of native symbols to Firebase servers. // By default, this is disabled to improve build speeds. // This flag must be enabled to see properly-symbolicated native // stack traces in the Crashlytics dashboard. nativeSymbolUploadEnabled true } } } }
Шаг 4 : Настройка автоматической загрузки собственных символов.
Для получения читаемых трассировок стека при сбоях NDK Crashlytics необходимо знать символы в ваших нативных бинарных файлах. Плагин Crashlytics для Gradle включает задачу uploadCrashlyticsSymbolFile BUILD_VARIANT для автоматизации этого процесса.
Чтобы получить доступ к задаче автоматической загрузки символов, убедитесь, что
nativeSymbolUploadEnabledимеет значениеtrueв вашем файле Gradle для модуля (на уровне приложения).Чтобы имена методов отображались в трассировках стека, необходимо явно вызывать задачу
uploadCrashlyticsSymbolFile BUILD_VARIANTпосле каждой сборки вашей библиотеки NDK. Например:>./gradlew app:assembleBUILD_VARIANT\ app:uploadCrashlyticsSymbolFileBUILD_VARIANT
И SDK Crashlytics для NDK, и плагин Crashlytics для Gradle зависят от наличия идентификатора сборки GNU в собственных разделяемых объектах.
Вы можете проверить наличие этого идентификатора, выполнив команду...
readelf -nдля каждого исполняемого файла. Если идентификатор сборки отсутствует, добавьте его.Добавьте флаги -Wl,--build-idв вашу систему сборки, чтобы исправить проблему.
Шаг 5 : Принудительно вызовите сбой теста, чтобы завершить настройку.
Чтобы завершить настройку Crashlytics и увидеть исходные данные на панели Crashlytics в консоли Firebase , необходимо принудительно вызвать сбой теста.
Добавьте в приложение код, который позволит принудительно вызвать сбой теста.
В главном окне приложения
MainActivityвы можете использовать следующий код, чтобы добавить кнопку, при нажатии на которую произойдет сбой. Кнопка будет называться "Test Crash".Kotlin
val crashButton = Button(this) crashButton.text = "Test Crash" crashButton.setOnClickListener { throw RuntimeException("Test Crash") // Force a crash } addContentView(crashButton, ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT))
Java
Button crashButton = new Button(this); crashButton.setText("Test Crash"); crashButton.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { throw new RuntimeException("Test Crash"); // Force a crash } }); addContentView(crashButton, new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
Создайте и запустите своё приложение.
Чтобы отправить первый отчет о сбое вашего приложения, необходимо принудительно вызвать сбой в тестовой среде:
Откройте приложение на тестовом устройстве или эмуляторе.
В вашем приложении нажмите кнопку "Проверить на наличие ошибок", которую вы добавили, используя приведенный выше код.
После сбоя приложения перезапустите его, чтобы приложение могло отправить отчет о сбое в Firebase.
В консоли Firebase перейдите в раздел DevOps & Engagement > Панель Crashlytics , чтобы проверить отчет о сбоях в тестах.
Если после обновления консоли сбой теста по-прежнему не наблюдается через пять минут, включите отладочное логирование, чтобы проверить, отправляет ли ваше приложение отчеты о сбоях.
Вот и всё! Crashlytics теперь отслеживает сбои в вашем приложении, и вы можете просматривать и анализировать отчёты о сбоях и статистику на панели управления Crashlytics .
Следующие шаги
(Рекомендуется) Получите помощь в отладке сбоев, вызванных ошибками нативной памяти, путем сбора отчетов GWP-ASan . Эти ошибки, связанные с памятью, могут быть связаны с повреждением памяти в вашем приложении, что является основной причиной уязвимостей безопасности приложений. Чтобы воспользоваться этой функцией отладки, убедитесь, что в вашем приложении явно включен GWP-ASan и используется последняя версия Crashlytics SDK для NDK (v18.3.6+ или Firebase BoM v31.3.0+).
Настройте параметры отчетов о сбоях , добавив возможность включения отчетов по желанию пользователя, журналы, ключи и отслеживание некритических ошибок.
Интеграция с Google Play позволит вам фильтровать отчеты о сбоях вашего Android-приложения по отслеживанию Google Play непосредственно на панели Crashlytics . Это позволит вам более точно сфокусировать панель мониторинга на конкретных сборках.
Поиск неисправностей
Если в консоли Firebase и в logcat отображаются разные трассировки стека, обратитесь к руководству по устранению неполадок .
Альтернативные варианты загрузки символов
Основной алгоритм работы, описанный на этой странице, применим к стандартным сборкам Gradle. Однако некоторые приложения используют другую конфигурацию или инструменты (например, процесс сборки, отличный от Gradle). В таких ситуациях для успешной загрузки символов могут быть полезны следующие параметры.
Опция : Загрузка символов для библиотечных модулей и внешних зависимостей.
Этот вариант может быть полезен в следующих ситуациях:
- Если вы используете собственный процесс сборки NDK в Gradle.
- Если ваши нативные библиотеки встроены в библиотечный/функциональный модуль или предоставлены сторонним разработчиком.
- Если автоматическая загрузка символов завершается с ошибкой или вы видите сообщения о сбоях без указания символов на панели Crashlytics , сообщите об этом.
Стандартная задача загрузки символов Crashlytics предполагает, что вы собираете свои нативные библиотеки в рамках сборки Gradle вашего модуля приложения, используя стандартные инструменты сборки NDK, такие как CMake.
Однако, если вы используете собственный процесс сборки NDK в Gradle, или ваши нативные библиотеки собираются в библиотечном/функциональном модуле или предоставляются сторонним поставщиком, вам может потребоваться явно указать путь к вашим неупорядоченным библиотекам. Для этого вы можете добавить свойство unstrippedNativeLibsDir в расширение Crashlytics в файле сборки Gradle.
Убедитесь, что вы выполнили следующие начальные задачи из основного рабочего процесса, описанные ранее на этой странице:
Чтобы задача автоматической загрузки символов могла найти информацию о ваших символах, добавьте следующее в файл Gradle вашего модуля (уровня приложения) (обычно
<project>/<app-module>/build.gradle.ktsили<project>/<app-module>/build.gradle):Kotlin
import com.google.firebase.crashlytics.buildtools.gradle.CrashlyticsExtension // ... android { // ... buildTypes { release { configure<CrashlyticsExtension> { nativeSymbolUploadEnabled = true unstrippedNativeLibsDir = file("PATH/TO/UNSTRIPPED/DIRECTORY") } } } }
Groovy
// ... android { // ... buildTypes { release { firebaseCrashlytics { nativeSymbolUploadEnabled true unstrippedNativeLibsDir file("PATH/TO/UNSTRIPPED/DIRECTORY") } } } }
Плагин Crashlytics будет рекурсивно искать в указанном каталоге нативные библиотеки с расширением
.so. Затем Crashlytics извлекает отладочные символы из всех таких библиотек и загружает их на серверы Firebase.Вот что можно указать в свойстве
unstrippedNativeLibsDir:Любой аргумент, допустимый для
org.gradle.api.Project#files(Object...), включая:java.lang.String,java.io.Fileилиorg.gradle.api.file.FileCollectionВозможность создания нескольких каталогов для одного варианта сборки путем предоставления списка или экземпляра
FileCollection(Начиная с плагина Crashlytics Gradle версии 3.0.0) Накопите несколько каталогов в отдельных продуктах и соберите варианты сборки.
Наконец, принудительно вызовите сбой при тестировании , чтобы завершить настройку Crashlytics и увидеть исходные данные на панели Crashlytics в консоли Firebase .
Опция : Загрузка символов для сборок, не использующих Gradle, или для недоступных необработанных нативных библиотек.
Этот вариант может быть полезен в следующих ситуациях:
Если вы используете процесс сборки, отличный от Gradle.
Если ваши необработанные нативные библиотеки предоставляются вам таким образом, что они недоступны во время сборки Gradle.
Для использования этой опции необходимо выполнить команду Firebase CLI при создании релизной сборки или любой другой сборки, для которой вы хотите видеть символизированные трассировки стека в консоли Firebase .
Убедитесь, что вы выполнили следующие начальные задачи из основного рабочего процесса, описанные ранее на этой странице:
Добавлены SDK Crashlytics для NDK и плагин Crashlytics для Gradle .
Обратите внимание, что при выборе этого варианта вам не нужно добавлять расширение
firebaseCrashlyticsили настраивать автоматическую загрузку символов, поскольку вместо этого вы будете использовать Firebase CLI (следующие шаги ниже) для генерации и загрузки файлов символов.Настройте среду и проект для загрузки символов:
Следуйте инструкциям для установки Firebase CLI .
Если вы уже установили CLI, обязательно обновите его до последней версии .
(Только для приложений, использующих Android API уровня 30 и выше) Обновите шаблон
AndroidManifest.xmlвашего приложения, чтобы отключить тегирование указателей:Установите флажок напротив пункта «Настройки Android-плеера» > «Настройки публикации» > «Сборка» > «Пользовательский основной манифест» .
Откройте шаблон манифеста, расположенный по адресу
Assets/Plugins/Android/AndroidManifest.xml.Добавьте следующий атрибут к тегу приложения:
<application android:allowNativeHeapPointerTagging="false" ... />
Создайте свой проект.
Загрузите информацию о ваших символах.
После завершения сборки сгенерируйте файл символов, совместимый с Crashlytics , и загрузите его на серверы Firebase, выполнив следующую команду Firebase CLI:
firebase crashlytics:symbols:upload --app=FIREBASE_APP_ID PATH/TO/SYMBOLS
FIREBASE_APP_ID : Ваш идентификатор приложения Firebase для Android (а не имя пакета).
Пример идентификатора Android-приложения Firebase:1:567383003300:android:17104a2ced0c9b9bВот два способа найти идентификатор вашего приложения Firebase:
В файле
google-services.jsonидентификатор вашего приложения — это значениеmobilesdk_app_id; илиВ консоли Firebase перейдите в настройки проекта . Перейдите к карточке «Ваши приложения» , затем щелкните нужное приложение Firebase, чтобы найти его идентификатор приложения.
PATH/TO/SYMBOLS : Путь к файлу символов, сгенерированному интерфейсом командной строки.
Экспортируется в проект Android Studio — PATH/TO/SYMBOLS может быть любой директорией. Firebase CLI будет рекурсивно искать в указанной директории нативные библиотеки с расширением
.so.APK-файл был создан непосредственно в Unity — PATH/TO/SYMBOLS — это путь к заархивированному файлу символов, сгенерированному в корневом каталоге проекта после завершения сборки (например:
myproject/myapp-1.0-v100.symbols.zip).
Ознакомьтесь с расширенными параметрами использования команды Firebase CLI для генерации и загрузки файлов символов.
Флаг Описание --generator=csymИспользует устаревший генератор файлов символов cSYM вместо генератора Breakpad по умолчанию.
Использовать не рекомендуется. Рекомендуем использовать генератор символов Breakpad по умолчанию.
--generator=breakpadИспользует генератор символов Breakpad.
Обратите внимание, что по умолчанию для генерации файла символов используется Breakpad. Используйте этот флаг только в том случае, если вы добавили
У вас в конфигурации сборки symbolGenerator { csym() }, и вы хотите переопределить его, чтобы использовать Breakpad вместо него.--dry-runГенерирует файлы символов, но не загружает их.
Этот флаг полезен, если вы хотите просмотреть содержимое отправляемых файлов.
--debugПредоставляет дополнительную отладочную информацию. Наконец, принудительно вызовите сбой при тестировании , чтобы завершить настройку Crashlytics и увидеть исходные данные на панели Crashlytics в консоли Firebase .
После сборки приложения и принудительного сбоя обязательно выполните команду Firebase CLI
crashlytics:symbols:upload, чтобы загрузить файл символов.
,
| Выберите платформу: | iOS+ Android Android NDK Flutter Unity |
Если вы используете нативные библиотеки в своем Android-приложении, вы можете включить полную трассировку стека и подробные отчеты о сбоях для вашего нативного кода из Firebase Crashlytics , внеся несколько небольших изменений в конфигурацию сборки вашего приложения.
В этом руководстве описано, как настроить отчеты о сбоях с помощью SDK Firebase Crashlytics для NDK.
Если вы хотите узнать, как начать работу с Crashlytics в ваших проектах Unity, ознакомьтесь с руководством по началу работы с Unity .
Прежде чем начать
Если вы еще этого не сделали, добавьте Firebase в свой Android-проект. Если у вас нет Android-приложения, вы можете скачать пример приложения .
Рекомендуется : Чтобы автоматически получать навигационные цепочки для анализа действий пользователя, предшествующих сбою, некритическому событию или событию ANR, необходимо включить Google Analytics в вашем проекте Firebase.
При создании нового проекта Firebase включите Google Analytics в процессе создания проекта.
Если вы используете существующий проект Firebase, в котором не включена Google Analytics , вы можете включить её в настройках проекта.
> Страница «Интеграции» в консоли Firebase .
Убедитесь, что ваше приложение соответствует следующим минимально необходимым требованиям:
- Gradle 8.0
- Плагин Android Gradle 8.1.0
- Плагин Gradle для сервисов Google 4.4.1
Шаг 1 : Добавьте Crashlytics SDK для NDK в ваше приложение.
В файле Gradle вашего модуля (уровня приложения) (обычно<project>/<app-module>/build.gradle.kts или <project>/<app-module>/build.gradle ) добавьте зависимость от библиотеки Crashlytics NDK для Android. Мы рекомендуем использовать Firebase Android BoM для управления версиями библиотек.Для оптимальной работы с Crashlytics мы рекомендуем включить Google Analytics в вашем проекте Firebase и добавить Firebase SDK для Google Analytics в ваше приложение.
dependencies { // Import the BoM for the Firebase platform implementation(platform("com.google.firebase:firebase-bom:34.18.0")) // Add the dependencies for the Crashlytics NDK and Analytics libraries // When using the BoM, you don't specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-crashlytics-ndk") implementation("com.google.firebase:firebase-analytics") }
Использование Firebase Android BoM , что ваше приложение всегда будет использовать совместимые версии библиотек Firebase Android.
(Альтернативный вариант) Добавление зависимостей библиотеки Firebase без использования BoM
Если вы решите не использовать Firebase BoM , вам необходимо указать версию каждой библиотеки Firebase в строке зависимости.
Обратите внимание, что если вы используете несколько библиотек Firebase в своем приложении, мы настоятельно рекомендуем использовать BoM для управления версиями библиотек, что гарантирует совместимость всех версий.
dependencies { // Add the dependencies for the Crashlytics NDK and Analytics libraries // When NOT using the BoM, you must specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-crashlytics-ndk:20.1.0") implementation("com.google.firebase:firebase-analytics:23.2.0") }
Шаг 2 : Добавьте плагин Crashlytics Gradle в ваше приложение.
В корневом (проектном) файле Gradle (
<project>/build.gradle.ktsили<project>/build.gradle) добавьте плагин Crashlytics Gradle в блокplugins:Kotlin
plugins { // Make sure that you have the AGP plugin 8.1+ dependency id("com.android.application") version "8.1.4" apply false // ... // Make sure that you have the Google services Gradle plugin 4.4.1+ dependency id("com.google.gms.google-services") version "4.5.0" apply false // Add the dependency for the Crashlytics Gradle plugin id("com.google.firebase.crashlytics") version "3.0.8" apply false }
Groovy
plugins { // Make sure that you have the AGP plugin 8.1+ dependency id 'com.android.application' version '8.1.4' apply false // ... // Make sure that you have the Google services Gradle plugin 4.4.1+ dependency id 'com.google.gms.google-services' version '4.5.0' apply false // Add the dependency for the Crashlytics Gradle plugin id 'com.google.firebase.crashlytics' version '3.0.8' apply false }
В файл Gradle вашего модуля (уровня приложения) (обычно
<project>/<app-module>/build.gradle.ktsили<project>/<app-module>/build.gradle) добавьте плагин Crashlytics Gradle:Kotlin
plugins { id("com.android.application") // ... // Make sure that you have the Google services Gradle plugin id("com.google.gms.google-services") // Add the Crashlytics Gradle plugin id("com.google.firebase.crashlytics") }
Groovy
plugins { id 'com.android.application' // ... // Make sure that you have the Google services Gradle plugin id 'com.google.gms.google-services' // Add the Crashlytics Gradle plugin id 'com.google.firebase.crashlytics' }
Шаг 3 : Добавьте расширение Crashlytics в вашу сборку.
В файле Gradle вашего модуля (уровня приложения) (обычно <project>/<app-module>/build.gradle.kts или <project>/<app-module>/build.gradle ) настройте расширение Crashlytics.
Kotlin
import com.google.firebase.crashlytics.buildtools.gradle.CrashlyticsExtension // ... android { // ... buildTypes { getByName("release") { // Add this extension configure<CrashlyticsExtension> { // Enable processing and uploading of native symbols to Firebase servers. // By default, this is disabled to improve build speeds. // This flag must be enabled to see properly-symbolicated native // stack traces in the Crashlytics dashboard. nativeSymbolUploadEnabled = true } } } }
Groovy
// ... android { // ... buildTypes { release { // Add this extension firebaseCrashlytics { // Enable processing and uploading of native symbols to Firebase servers. // By default, this is disabled to improve build speeds. // This flag must be enabled to see properly-symbolicated native // stack traces in the Crashlytics dashboard. nativeSymbolUploadEnabled true } } } }
Шаг 4 : Настройка автоматической загрузки собственных символов.
Для получения читаемых трассировок стека при сбоях NDK Crashlytics необходимо знать символы в ваших нативных бинарных файлах. Плагин Crashlytics для Gradle включает задачу uploadCrashlyticsSymbolFile BUILD_VARIANT для автоматизации этого процесса.
Чтобы получить доступ к задаче автоматической загрузки символов, убедитесь, что
nativeSymbolUploadEnabledимеет значениеtrueв вашем файле Gradle для модуля (на уровне приложения).Чтобы имена методов отображались в трассировках стека, необходимо явно вызывать задачу
uploadCrashlyticsSymbolFile BUILD_VARIANTпосле каждой сборки вашей библиотеки NDK. Например:>./gradlew app:assembleBUILD_VARIANT\ app:uploadCrashlyticsSymbolFileBUILD_VARIANT
И SDK Crashlytics для NDK, и плагин Crashlytics для Gradle зависят от наличия идентификатора сборки GNU в собственных разделяемых объектах.
Вы можете проверить наличие этого идентификатора, выполнив команду...
readelf -nдля каждого исполняемого файла. Если идентификатор сборки отсутствует, добавьте его.Добавьте флаги -Wl,--build-idв вашу систему сборки, чтобы исправить проблему.
Шаг 5 : Принудительно вызовите сбой теста, чтобы завершить настройку.
Чтобы завершить настройку Crashlytics и увидеть исходные данные на панели Crashlytics в консоли Firebase , необходимо принудительно вызвать сбой теста.
Добавьте в приложение код, который позволит принудительно вызвать сбой теста.
В главном окне приложения
MainActivityвы можете использовать следующий код, чтобы добавить кнопку, при нажатии на которую произойдет сбой. Кнопка будет называться "Test Crash".Kotlin
val crashButton = Button(this) crashButton.text = "Test Crash" crashButton.setOnClickListener { throw RuntimeException("Test Crash") // Force a crash } addContentView(crashButton, ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT))
Java
Button crashButton = new Button(this); crashButton.setText("Test Crash"); crashButton.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { throw new RuntimeException("Test Crash"); // Force a crash } }); addContentView(crashButton, new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
Создайте и запустите своё приложение.
Чтобы отправить первый отчет о сбое вашего приложения, необходимо принудительно вызвать сбой в тестовой среде:
Откройте приложение на тестовом устройстве или эмуляторе.
В вашем приложении нажмите кнопку "Проверить на наличие ошибок", которую вы добавили, используя приведенный выше код.
После сбоя приложения перезапустите его, чтобы приложение могло отправить отчет о сбое в Firebase.
В консоли Firebase перейдите в раздел DevOps & Engagement > Панель Crashlytics , чтобы проверить отчет о сбоях в тестах.
Если после обновления консоли сбой теста по-прежнему не наблюдается через пять минут, включите отладочное логирование, чтобы проверить, отправляет ли ваше приложение отчеты о сбоях.
Вот и всё! Crashlytics теперь отслеживает сбои в вашем приложении, и вы можете просматривать и анализировать отчёты о сбоях и статистику на панели управления Crashlytics .
Следующие шаги
(Рекомендуется) Получите помощь в отладке сбоев, вызванных ошибками нативной памяти, путем сбора отчетов GWP-ASan . Эти ошибки, связанные с памятью, могут быть связаны с повреждением памяти в вашем приложении, что является основной причиной уязвимостей безопасности приложений. Чтобы воспользоваться этой функцией отладки, убедитесь, что в вашем приложении явно включен GWP-ASan и используется последняя версия Crashlytics SDK для NDK (v18.3.6+ или Firebase BoM v31.3.0+).
Настройте параметры отчетов о сбоях , добавив возможность включения отчетов по желанию пользователя, журналы, ключи и отслеживание некритических ошибок.
Интеграция с Google Play позволит вам фильтровать отчеты о сбоях вашего Android-приложения по отслеживанию Google Play непосредственно на панели Crashlytics . Это позволит вам более точно сфокусировать панель мониторинга на конкретных сборках.
Поиск неисправностей
Если в консоли Firebase и в logcat отображаются разные трассировки стека, обратитесь к руководству по устранению неполадок .
Альтернативные варианты загрузки символов
Основной алгоритм работы, описанный на этой странице, применим к стандартным сборкам Gradle. Однако некоторые приложения используют другую конфигурацию или инструменты (например, процесс сборки, отличный от Gradle). В таких ситуациях для успешной загрузки символов могут быть полезны следующие параметры.
Опция : Загрузка символов для библиотечных модулей и внешних зависимостей.
Этот вариант может быть полезен в следующих ситуациях:
- Если вы используете собственный процесс сборки NDK в Gradle.
- Если ваши нативные библиотеки встроены в библиотечный/функциональный модуль или предоставлены сторонним разработчиком.
- Если автоматическая загрузка символов завершается с ошибкой или вы видите сообщения о сбоях без указания символов на панели Crashlytics , сообщите об этом.
Стандартная задача загрузки символов Crashlytics предполагает, что вы собираете свои нативные библиотеки в рамках сборки Gradle вашего модуля приложения, используя стандартные инструменты сборки NDK, такие как CMake.
Однако, если вы используете собственный процесс сборки NDK в Gradle, или ваши нативные библиотеки собираются в библиотечном/функциональном модуле или предоставляются сторонним поставщиком, вам может потребоваться явно указать путь к вашим неупорядоченным библиотекам. Для этого вы можете добавить свойство unstrippedNativeLibsDir в расширение Crashlytics в файле сборки Gradle.
Убедитесь, что вы выполнили следующие начальные задачи из основного рабочего процесса, описанные ранее на этой странице:
Чтобы задача автоматической загрузки символов могла найти информацию о ваших символах, добавьте следующее в файл Gradle вашего модуля (уровня приложения) (обычно
<project>/<app-module>/build.gradle.ktsили<project>/<app-module>/build.gradle):Kotlin
import com.google.firebase.crashlytics.buildtools.gradle.CrashlyticsExtension // ... android { // ... buildTypes { release { configure<CrashlyticsExtension> { nativeSymbolUploadEnabled = true unstrippedNativeLibsDir = file("PATH/TO/UNSTRIPPED/DIRECTORY") } } } }
Groovy
// ... android { // ... buildTypes { release { firebaseCrashlytics { nativeSymbolUploadEnabled true unstrippedNativeLibsDir file("PATH/TO/UNSTRIPPED/DIRECTORY") } } } }
Плагин Crashlytics будет рекурсивно искать в указанном каталоге нативные библиотеки с расширением
.so. Затем Crashlytics извлекает отладочные символы из всех таких библиотек и загружает их на серверы Firebase.Вот что можно указать в свойстве
unstrippedNativeLibsDir:Любой аргумент, допустимый для
org.gradle.api.Project#files(Object...), включая:java.lang.String,java.io.Fileилиorg.gradle.api.file.FileCollectionВозможность создания нескольких каталогов для одного варианта сборки путем предоставления списка или экземпляра
FileCollection(Начиная с плагина Crashlytics Gradle версии 3.0.0) Накопите несколько каталогов в отдельных продуктах и соберите варианты сборки.
Наконец, принудительно вызовите сбой при тестировании , чтобы завершить настройку Crashlytics и увидеть исходные данные на панели Crashlytics в консоли Firebase .
Опция : Загрузка символов для сборок, не использующих Gradle, или для недоступных необработанных нативных библиотек.
Этот вариант может быть полезен в следующих ситуациях:
Если вы используете процесс сборки, отличный от Gradle.
Если ваши необработанные нативные библиотеки предоставляются вам таким образом, что они недоступны во время сборки Gradle.
Для использования этой опции необходимо выполнить команду Firebase CLI при создании релизной сборки или любой другой сборки, для которой вы хотите видеть символизированные трассировки стека в консоли Firebase .
Убедитесь, что вы выполнили следующие начальные задачи из основного рабочего процесса, описанные ранее на этой странице:
Добавлены SDK Crashlytics для NDK и плагин Crashlytics для Gradle .
Обратите внимание, что при выборе этого варианта вам не нужно добавлять расширение
firebaseCrashlyticsили настраивать автоматическую загрузку символов, поскольку вместо этого вы будете использовать Firebase CLI (следующие шаги ниже) для генерации и загрузки файлов символов.Настройте среду и проект для загрузки символов:
Следуйте инструкциям для установки Firebase CLI .
Если вы уже установили CLI, обязательно обновите его до последней версии .
(Только для приложений, использующих Android API уровня 30 и выше) Обновите шаблон
AndroidManifest.xmlвашего приложения, чтобы отключить тегирование указателей:Установите флажок напротив пункта «Настройки Android-плеера» > «Настройки публикации» > «Сборка» > «Пользовательский основной манифест» .
Откройте шаблон манифеста, расположенный по адресу
Assets/Plugins/Android/AndroidManifest.xml.Добавьте следующий атрибут к тегу приложения:
<application android:allowNativeHeapPointerTagging="false" ... />
Создайте свой проект.
Загрузите информацию о ваших символах.
После завершения сборки сгенерируйте файл символов, совместимый с Crashlytics , и загрузите его на серверы Firebase, выполнив следующую команду Firebase CLI:
firebase crashlytics:symbols:upload --app=FIREBASE_APP_ID PATH/TO/SYMBOLS
FIREBASE_APP_ID : Ваш идентификатор приложения Firebase для Android (а не имя пакета).
Пример идентификатора Android-приложения Firebase:1:567383003300:android:17104a2ced0c9b9bВот два способа найти идентификатор вашего приложения Firebase:
В файле
google-services.jsonидентификатор вашего приложения — это значениеmobilesdk_app_id; илиВ консоли Firebase перейдите в настройки проекта . Перейдите к карточке «Ваши приложения» , затем щелкните нужное приложение Firebase, чтобы найти его идентификатор приложения.
PATH/TO/SYMBOLS : Путь к файлу символов, сгенерированному интерфейсом командной строки.
Экспортируется в проект Android Studio — PATH/TO/SYMBOLS может быть любой директорией. Firebase CLI будет рекурсивно искать в указанной директории нативные библиотеки с расширением
.so.APK-файл был создан непосредственно в Unity — PATH/TO/SYMBOLS — это путь к заархивированному файлу символов, сгенерированному в корневом каталоге проекта после завершения сборки (например:
myproject/myapp-1.0-v100.symbols.zip).
Ознакомьтесь с расширенными параметрами использования команды Firebase CLI для генерации и загрузки файлов символов.
Флаг Описание --generator=csymИспользует устаревший генератор файлов символов cSYM вместо генератора Breakpad по умолчанию.
Использовать не рекомендуется. Рекомендуем использовать генератор символов Breakpad по умолчанию.
--generator=breakpadИспользует генератор символов Breakpad.
Обратите внимание, что по умолчанию для генерации файла символов используется Breakpad. Используйте этот флаг только в том случае, если вы добавили
У вас в конфигурации сборки symbolGenerator { csym() }, и вы хотите переопределить его, чтобы использовать Breakpad вместо него.--dry-runГенерирует файлы символов, но не загружает их.
Этот флаг полезен, если вы хотите просмотреть содержимое отправляемых файлов.
--debugПредоставляет дополнительную отладочную информацию. Наконец, принудительно вызовите сбой при тестировании , чтобы завершить настройку Crashlytics и увидеть исходные данные на панели Crashlytics в консоли Firebase .
После сборки приложения и принудительного сбоя обязательно выполните команду Firebase CLI
crashlytics:symbols:upload, чтобы загрузить файл символов.
,
| Выберите платформу: | iOS+ Android Android NDK Flutter Unity |
Если вы используете нативные библиотеки в своем Android-приложении, вы можете включить полную трассировку стека и подробные отчеты о сбоях для вашего нативного кода из Firebase Crashlytics , внеся несколько небольших изменений в конфигурацию сборки вашего приложения.
В этом руководстве описано, как настроить отчеты о сбоях с помощью SDK Firebase Crashlytics для NDK.
Если вы хотите узнать, как начать работу с Crashlytics в ваших проектах Unity, ознакомьтесь с руководством по началу работы с Unity .
Прежде чем начать
Если вы еще этого не сделали, добавьте Firebase в свой Android-проект. Если у вас нет Android-приложения, вы можете скачать пример приложения .
Рекомендуется : Чтобы автоматически получать навигационные цепочки для анализа действий пользователя, предшествующих сбою, некритическому событию или событию ANR, необходимо включить Google Analytics в вашем проекте Firebase.
При создании нового проекта Firebase включите Google Analytics в процессе создания проекта.
Если вы используете существующий проект Firebase, в котором не включена Google Analytics , вы можете включить её в настройках проекта.
> Страница «Интеграции» в консоли Firebase .
Убедитесь, что ваше приложение соответствует следующим минимально необходимым требованиям:
- Gradle 8.0
- Плагин Android Gradle 8.1.0
- Плагин Gradle для сервисов Google 4.4.1
Шаг 1 : Добавьте Crashlytics SDK для NDK в ваше приложение.
В файле Gradle вашего модуля (уровня приложения) (обычно<project>/<app-module>/build.gradle.kts или <project>/<app-module>/build.gradle ) добавьте зависимость от библиотеки Crashlytics NDK для Android. Мы рекомендуем использовать Firebase Android BoM для управления версиями библиотек.Для оптимальной работы с Crashlytics мы рекомендуем включить Google Analytics в вашем проекте Firebase и добавить Firebase SDK для Google Analytics в ваше приложение.
dependencies { // Import the BoM for the Firebase platform implementation(platform("com.google.firebase:firebase-bom:34.18.0")) // Add the dependencies for the Crashlytics NDK and Analytics libraries // When using the BoM, you don't specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-crashlytics-ndk") implementation("com.google.firebase:firebase-analytics") }
Использование Firebase Android BoM , что ваше приложение всегда будет использовать совместимые версии библиотек Firebase Android.
(Альтернативный вариант) Добавление зависимостей библиотеки Firebase без использования BoM
Если вы решите не использовать Firebase BoM , вам необходимо указать версию каждой библиотеки Firebase в строке зависимости.
Обратите внимание, что если вы используете несколько библиотек Firebase в своем приложении, мы настоятельно рекомендуем использовать BoM для управления версиями библиотек, что гарантирует совместимость всех версий.
dependencies { // Add the dependencies for the Crashlytics NDK and Analytics libraries // When NOT using the BoM, you must specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-crashlytics-ndk:20.1.0") implementation("com.google.firebase:firebase-analytics:23.2.0") }
Шаг 2 : Добавьте плагин Crashlytics Gradle в ваше приложение.
В корневом (проектном) файле Gradle (
<project>/build.gradle.ktsили<project>/build.gradle) добавьте плагин Crashlytics Gradle в блокplugins:Kotlin
plugins { // Make sure that you have the AGP plugin 8.1+ dependency id("com.android.application") version "8.1.4" apply false // ... // Make sure that you have the Google services Gradle plugin 4.4.1+ dependency id("com.google.gms.google-services") version "4.5.0" apply false // Add the dependency for the Crashlytics Gradle plugin id("com.google.firebase.crashlytics") version "3.0.8" apply false }
Groovy
plugins { // Make sure that you have the AGP plugin 8.1+ dependency id 'com.android.application' version '8.1.4' apply false // ... // Make sure that you have the Google services Gradle plugin 4.4.1+ dependency id 'com.google.gms.google-services' version '4.5.0' apply false // Add the dependency for the Crashlytics Gradle plugin id 'com.google.firebase.crashlytics' version '3.0.8' apply false }
В файл Gradle вашего модуля (уровня приложения) (обычно
<project>/<app-module>/build.gradle.ktsили<project>/<app-module>/build.gradle) добавьте плагин Crashlytics Gradle:Kotlin
plugins { id("com.android.application") // ... // Make sure that you have the Google services Gradle plugin id("com.google.gms.google-services") // Add the Crashlytics Gradle plugin id("com.google.firebase.crashlytics") }
Groovy
plugins { id 'com.android.application' // ... // Make sure that you have the Google services Gradle plugin id 'com.google.gms.google-services' // Add the Crashlytics Gradle plugin id 'com.google.firebase.crashlytics' }
Шаг 3 : Добавьте расширение Crashlytics в вашу сборку.
В файле Gradle вашего модуля (уровня приложения) (обычно <project>/<app-module>/build.gradle.kts или <project>/<app-module>/build.gradle ) настройте расширение Crashlytics.
Kotlin
import com.google.firebase.crashlytics.buildtools.gradle.CrashlyticsExtension // ... android { // ... buildTypes { getByName("release") { // Add this extension configure<CrashlyticsExtension> { // Enable processing and uploading of native symbols to Firebase servers. // By default, this is disabled to improve build speeds. // This flag must be enabled to see properly-symbolicated native // stack traces in the Crashlytics dashboard. nativeSymbolUploadEnabled = true } } } }
Groovy
// ... android { // ... buildTypes { release { // Add this extension firebaseCrashlytics { // Enable processing and uploading of native symbols to Firebase servers. // By default, this is disabled to improve build speeds. // This flag must be enabled to see properly-symbolicated native // stack traces in the Crashlytics dashboard. nativeSymbolUploadEnabled true } } } }
Шаг 4 : Настройка автоматической загрузки собственных символов.
Для получения читаемых трассировок стека при сбоях NDK Crashlytics необходимо знать символы в ваших нативных бинарных файлах. Плагин Crashlytics для Gradle включает задачу uploadCrashlyticsSymbolFile BUILD_VARIANT для автоматизации этого процесса.
Чтобы получить доступ к задаче автоматической загрузки символов, убедитесь, что
nativeSymbolUploadEnabledимеет значениеtrueв вашем файле Gradle для модуля (на уровне приложения).Чтобы имена методов отображались в трассировках стека, необходимо явно вызывать задачу
uploadCrashlyticsSymbolFile BUILD_VARIANTпосле каждой сборки вашей библиотеки NDK. Например:>./gradlew app:assembleBUILD_VARIANT\ app:uploadCrashlyticsSymbolFileBUILD_VARIANT
И SDK Crashlytics для NDK, и плагин Crashlytics для Gradle зависят от наличия идентификатора сборки GNU в собственных разделяемых объектах.
Вы можете проверить наличие этого идентификатора, выполнив команду...
readelf -nдля каждого исполняемого файла. Если идентификатор сборки отсутствует, добавьте его.Добавьте флаги -Wl,--build-idв вашу систему сборки, чтобы исправить проблему.
Шаг 5 : Принудительно вызовите сбой теста, чтобы завершить настройку.
Чтобы завершить настройку Crashlytics и увидеть исходные данные на панели Crashlytics в консоли Firebase , необходимо принудительно вызвать сбой теста.
Добавьте в приложение код, который позволит принудительно вызвать сбой теста.
В главном окне приложения
MainActivityвы можете использовать следующий код, чтобы добавить кнопку, при нажатии на которую произойдет сбой. Кнопка будет называться "Test Crash".Kotlin
val crashButton = Button(this) crashButton.text = "Test Crash" crashButton.setOnClickListener { throw RuntimeException("Test Crash") // Force a crash } addContentView(crashButton, ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT))
Java
Button crashButton = new Button(this); crashButton.setText("Test Crash"); crashButton.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { throw new RuntimeException("Test Crash"); // Force a crash } }); addContentView(crashButton, new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
Создайте и запустите своё приложение.
Чтобы отправить первый отчет о сбое вашего приложения, необходимо принудительно вызвать сбой в тестовой среде:
Откройте приложение на тестовом устройстве или эмуляторе.
В вашем приложении нажмите кнопку "Проверить на наличие ошибок", которую вы добавили, используя приведенный выше код.
После сбоя приложения перезапустите его, чтобы приложение могло отправить отчет о сбое в Firebase.
В консоли Firebase перейдите в раздел DevOps & Engagement > Панель Crashlytics , чтобы проверить отчет о сбоях в тестах.
Если после обновления консоли сбой теста по-прежнему не наблюдается через пять минут, включите отладочное логирование, чтобы проверить, отправляет ли ваше приложение отчеты о сбоях.
Вот и всё! Crashlytics теперь отслеживает сбои в вашем приложении, и вы можете просматривать и анализировать отчёты о сбоях и статистику на панели управления Crashlytics .
Следующие шаги
(Рекомендуется) Получите помощь в отладке сбоев, вызванных ошибками нативной памяти, путем сбора отчетов GWP-ASan . Эти ошибки, связанные с памятью, могут быть связаны с повреждением памяти в вашем приложении, что является основной причиной уязвимостей безопасности приложений. Чтобы воспользоваться этой функцией отладки, убедитесь, что в вашем приложении явно включен GWP-ASan и используется последняя версия Crashlytics SDK для NDK (v18.3.6+ или Firebase BoM v31.3.0+).
Настройте параметры отчетов о сбоях , добавив возможность включения отчетов по желанию пользователя, журналы, ключи и отслеживание некритических ошибок.
Интеграция с Google Play позволит вам фильтровать отчеты о сбоях вашего Android-приложения по отслеживанию Google Play непосредственно на панели Crashlytics . Это позволит вам более точно сфокусировать панель мониторинга на конкретных сборках.
Поиск неисправностей
Если в консоли Firebase и в logcat отображаются разные трассировки стека, обратитесь к руководству по устранению неполадок .
Альтернативные варианты загрузки символов
Основной алгоритм работы, описанный на этой странице, применим к стандартным сборкам Gradle. Однако некоторые приложения используют другую конфигурацию или инструменты (например, процесс сборки, отличный от Gradle). В таких ситуациях для успешной загрузки символов могут быть полезны следующие параметры.
Опция : Загрузка символов для библиотечных модулей и внешних зависимостей.
Этот вариант может быть полезен в следующих ситуациях:
- Если вы используете собственный процесс сборки NDK в Gradle.
- Если ваши нативные библиотеки встроены в библиотечный/функциональный модуль или предоставлены сторонним разработчиком.
- Если автоматическая загрузка символов завершается с ошибкой или вы видите сообщения о сбоях без указания символов на панели Crashlytics , сообщите об этом.
Стандартная задача загрузки символов Crashlytics предполагает, что вы собираете свои нативные библиотеки в рамках сборки Gradle вашего модуля приложения, используя стандартные инструменты сборки NDK, такие как CMake.
Однако, если вы используете собственный процесс сборки NDK в Gradle, или ваши нативные библиотеки собираются в библиотечном/функциональном модуле или предоставляются сторонним поставщиком, вам может потребоваться явно указать путь к вашим неупорядоченным библиотекам. Для этого вы можете добавить свойство unstrippedNativeLibsDir в расширение Crashlytics в файле сборки Gradle.
Make sure that you've completed the following initial tasks from the main workflow earlier on this page:
So that the automatic symbol uploading task can find your symbol information, add the following to your module (app-level) Gradle file (usually
<project>/<app-module>/build.gradle.ktsor<project>/<app-module>/build.gradle):Kotlin
import com.google.firebase.crashlytics.buildtools.gradle.CrashlyticsExtension // ... android { // ... buildTypes { release { configure<CrashlyticsExtension> { nativeSymbolUploadEnabled = true unstrippedNativeLibsDir = file("PATH/TO/UNSTRIPPED/DIRECTORY") } } } }
Groovy
// ... android { // ... buildTypes { release { firebaseCrashlytics { nativeSymbolUploadEnabled true unstrippedNativeLibsDir file("PATH/TO/UNSTRIPPED/DIRECTORY") } } } }
The Crashlytics plugin will recursively search the specified directory for native libraries with a
.soextension. Crashlytics then extracts debugging symbols from all such libraries and uploads them to the Firebase servers.Here's what you can specify in the
unstrippedNativeLibsDirproperty:Any argument allowable for
org.gradle.api.Project#files(Object...), including:java.lang.String,java.io.File, ororg.gradle.api.file.FileCollectionMultiple directories for a single build flavor by providing a list or
FileCollectioninstance(Starting with Crashlytics Gradle plugin v3.0.0) Accumulate multiple directories in individual products and build flavors.
Finally, force a test crash to finish setting up Crashlytics and to see initial data in the Crashlytics dashboard of the Firebase console.
Option : Upload symbols for non-Gradle builds or inaccessible unstripped native libraries
This option can be helpful in the following situations:
If you use a build process other than Gradle
If your unstripped native libraries are provided to you in some way that they're not accessible during Gradle builds
This option requires that you run a Firebase CLI command when you create a release build or any build for which you want to see symbolicated stack traces in the Firebase console.
Make sure that you've completed the following initial tasks from the main workflow earlier on this page:
Added the Crashlytics SDK for NDK and the Crashlytics Gradle plugin .
Note that with this option, you don't need to add the
firebaseCrashlyticsextension or set up automatic symbol uploading because you'll instead use the Firebase CLI (next steps below) to generate and upload your symbol files.Set up your environment and project for symbol uploading:
Follow the instructions to install the Firebase CLI .
If you've already installed the CLI, make sure to update to its latest version .
(only for apps using Android API level 30+) Update your app's
AndroidManifest.xmltemplate to disable Pointer Tagging:Check the box for Android Player Settings > Publishing Settings > Build > Custom Main Manifest .
Open the manifest template located at
Assets/Plugins/Android/AndroidManifest.xml.Add the following attribute to the application tag:
<application android:allowNativeHeapPointerTagging="false" ... />
Build your project.
Upload your symbols information.
Once your build has finished, generate a Crashlytics -compatible symbol file and upload it to Firebase servers by running the following Firebase CLI command:
firebase crashlytics:symbols:upload --app=FIREBASE_APP_ID PATH/TO/SYMBOLS
FIREBASE_APP_ID : Ваш идентификатор приложения Firebase для Android (а не имя пакета).
Пример идентификатора Android-приложения Firebase:1:567383003300:android:17104a2ced0c9b9bВот два способа найти идентификатор вашего приложения Firebase:
В файле
google-services.jsonидентификатор вашего приложения — это значениеmobilesdk_app_id; илиВ консоли Firebase перейдите в настройки проекта . Перейдите к карточке «Ваши приложения» , затем щелкните нужное приложение Firebase, чтобы найти его идентификатор приложения.
PATH/TO/SYMBOLS : The path to the symbol file generated by the CLI
Exported to an Android Studio project — PATH/TO/SYMBOLS can be any directory. The Firebase CLI will recursively search the specified directory for native libraries with a
.soextension.Built the APK directly from within Unity — PATH/TO/SYMBOLS is the path of the zipped symbol file generated in the project root directory when your build finished (for example:
myproject/myapp-1.0-v100.symbols.zip).
View advanced options for using the Firebase CLI command for symbol file generation and upload
Флаг Описание --generator=csymUses the legacy cSYM symbol file generator instead of the default Breakpad generator
Not recommended for use. We recommend using the default Breakpad symbol file generator.
--generator=breakpadUses the Breakpad symbol file generator
Note that the default for symbol file generation is Breakpad. Only use this flag if you've added
symbolGenerator { csym() }in your build configuration and you want to override it to use Breakpad instead.--dry-runGenerates the symbol files but does not upload them
This flag is useful if you want to inspect the content of the files that are sent.
--debugProvides additional debugging information Finally, force a test crash to finish setting up Crashlytics and to see initial data in the Crashlytics dashboard of the Firebase console.
After you build your app as part of forcing a crash, make sure to run the Firebase CLI
crashlytics:symbols:uploadcommand to upload your symbol file.
,
| Выберите платформу: | iOS+ Android Android NDK Flutter Unity |
If you use native libraries in your Android app, you can enable full stack traces and detailed crash reports for your native code from Firebase Crashlytics with a few small updates to your app's build configuration.
This guide describes how to configure crash reporting with the Firebase Crashlytics SDK for NDK.
If you're looking for how to get started with Crashlytics in your Unity projects, check out the Unity Getting Started guide .
Прежде чем начать
If you haven't already, add Firebase to your Android project. If you don't have an Android app, you can download a sample app .
Recommended : To automatically get breadcrumb logs to understand user actions leading up to a crash, non-fatal, or ANR event, you need to enable Google Analytics in your Firebase project.
If you're creating a new Firebase project, enable Google Analytics during the project creation workflow.
If you're using an existing Firebase project that doesn't have Google Analytics enabled, you can enable it in the
> Страница «Интеграции» в консоли Firebase .
Make sure your app has the following minimum required versions:
- Gradle 8.0
- Android Gradle plugin 8.1.0
- Google services Gradle plugin 4.4.1
Step 1 : Add the Crashlytics SDK for NDK to your app
In your module (app-level) Gradle file (usually<project>/<app-module>/build.gradle.kts or <project>/<app-module>/build.gradle ), add the dependency for the Crashlytics NDK library for Android. We recommend using the Firebase Android BoM to control library versioning.For an optimal experience with Crashlytics , we recommend enabling Google Analytics in your Firebase project and adding the Firebase SDK for Google Analytics to your app.
dependencies { // Import the BoM for the Firebase platform implementation(platform("com.google.firebase:firebase-bom:34.18.0")) // Add the dependencies for the Crashlytics NDK and Analytics libraries // When using the BoM, you don't specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-crashlytics-ndk") implementation("com.google.firebase:firebase-analytics") }
Использование Firebase Android BoM , что ваше приложение всегда будет использовать совместимые версии библиотек Firebase Android.
(Альтернативный вариант) Добавление зависимостей библиотеки Firebase без использования BoM
Если вы решите не использовать Firebase BoM , вам необходимо указать версию каждой библиотеки Firebase в строке зависимости.
Обратите внимание, что если вы используете несколько библиотек Firebase в своем приложении, мы настоятельно рекомендуем использовать BoM для управления версиями библиотек, что гарантирует совместимость всех версий.
dependencies { // Add the dependencies for the Crashlytics NDK and Analytics libraries // When NOT using the BoM, you must specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-crashlytics-ndk:20.1.0") implementation("com.google.firebase:firebase-analytics:23.2.0") }
Step 2 : Add the Crashlytics Gradle plugin to your app
In your root-level (project-level) Gradle file (
<project>/build.gradle.ktsor<project>/build.gradle), add the Crashlytics Gradle plugin to thepluginsblock:Kotlin
plugins { // Make sure that you have the AGP plugin 8.1+ dependency id("com.android.application") version "8.1.4" apply false // ... // Make sure that you have the Google services Gradle plugin 4.4.1+ dependency id("com.google.gms.google-services") version "4.5.0" apply false // Add the dependency for the Crashlytics Gradle plugin id("com.google.firebase.crashlytics") version "3.0.8" apply false }
Groovy
plugins { // Make sure that you have the AGP plugin 8.1+ dependency id 'com.android.application' version '8.1.4' apply false // ... // Make sure that you have the Google services Gradle plugin 4.4.1+ dependency id 'com.google.gms.google-services' version '4.5.0' apply false // Add the dependency for the Crashlytics Gradle plugin id 'com.google.firebase.crashlytics' version '3.0.8' apply false }
In your module (app-level) Gradle file (usually
<project>/<app-module>/build.gradle.ktsor<project>/<app-module>/build.gradle), add the Crashlytics Gradle plugin:Kotlin
plugins { id("com.android.application") // ... // Make sure that you have the Google services Gradle plugin id("com.google.gms.google-services") // Add the Crashlytics Gradle plugin id("com.google.firebase.crashlytics") }
Groovy
plugins { id 'com.android.application' // ... // Make sure that you have the Google services Gradle plugin id 'com.google.gms.google-services' // Add the Crashlytics Gradle plugin id 'com.google.firebase.crashlytics' }
Step 3 : Add the Crashlytics extension to your build
In your module (app-level) Gradle file (usually <project>/<app-module>/build.gradle.kts or <project>/<app-module>/build.gradle ), configure the Crashlytics extension.
Kotlin
import com.google.firebase.crashlytics.buildtools.gradle.CrashlyticsExtension // ... android { // ... buildTypes { getByName("release") { // Add this extension configure<CrashlyticsExtension> { // Enable processing and uploading of native symbols to Firebase servers. // By default, this is disabled to improve build speeds. // This flag must be enabled to see properly-symbolicated native // stack traces in the Crashlytics dashboard. nativeSymbolUploadEnabled = true } } } }
Groovy
// ... android { // ... buildTypes { release { // Add this extension firebaseCrashlytics { // Enable processing and uploading of native symbols to Firebase servers. // By default, this is disabled to improve build speeds. // This flag must be enabled to see properly-symbolicated native // stack traces in the Crashlytics dashboard. nativeSymbolUploadEnabled true } } } }
Step 4 : Set up automatic uploading of native symbols
To produce readable stack traces from NDK crashes, Crashlytics needs to know about the symbols in your native binaries. The Crashlytics Gradle plugin includes the uploadCrashlyticsSymbolFile BUILD_VARIANT task to automate this process.
So that you can access the task for automated symbol uploading, make sure that
nativeSymbolUploadEnabledis set totruein your module (app-level) Gradle file.For method names to appear in your stack traces, you must explicitly invoke the
uploadCrashlyticsSymbolFile BUILD_VARIANTtask after each build of your NDK library. For example:>./gradlew app:assembleBUILD_VARIANT\ app:uploadCrashlyticsSymbolFileBUILD_VARIANT
Both the Crashlytics SDK for NDK and the Crashlytics Gradle plugin depend on the presence of the GNU build ID within the native shared objects.
You can verify the presence of this ID by running
readelf -non each binary. If the build ID is absent, add-Wl,--build-idto your build system's flags to fix the problem.
Step 5 : Force a test crash to finish setup
To finish setting up Crashlytics and see initial data in the Crashlytics dashboard of the Firebase console, you need to force a test crash.
Add code to your app that you can use to force a test crash.
You can use the following code in your app's
MainActivityto add a button to your app that, when pressed, causes a crash. The button is labeled "Test Crash".Kotlin
val crashButton = Button(this) crashButton.text = "Test Crash" crashButton.setOnClickListener { throw RuntimeException("Test Crash") // Force a crash } addContentView(crashButton, ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT))
Java
Button crashButton = new Button(this); crashButton.setText("Test Crash"); crashButton.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { throw new RuntimeException("Test Crash"); // Force a crash } }); addContentView(crashButton, new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
Build and run your app.
Force the test crash in order to send your app's first crash report:
Open your app from your test device or emulator.
In your app, press the "Test Crash" button that you added using the code above.
After your app crashes, restart it so that your app can send the crash report to Firebase.
In the Firebase console, go to the DevOps & Engagement > Crashlytics dashboard to check for your test crash report.
If you've refreshed the console and you're still not seeing the test crash after five minutes, enable debug logging to see if your app is sending crash reports.
And that's it! Crashlytics is now monitoring your app for crashes, and you can view and investigate crash reports and statistics in the Crashlytics dashboard.
Следующие шаги
(Recommended) Get help debugging crashes caused by native memory errors by collecting GWP-ASan reports . These memory-related errors can be associated with memory corruption within your app, which is the leading cause of app security vulnerabilities. To take advantage of this debugging feature, make sure your app has GWP-ASan explicitly enabled and uses the latest Crashlytics SDK for NDK (v18.3.6+ or Firebase BoM v31.3.0+).
Customize your crash report setup by adding opt-in reporting, logs, keys, and tracking of non-fatal errors.
Integrate with Google Play so that you can filter your Android app's crash reports by Google Play track directly in the Crashlytics dashboard. This allows you to better focus your dashboard on specific builds.
Поиск неисправностей
If you're seeing different stack traces in the Firebase console and in the logcat, refer to the Troubleshooting guide .
Alternative options for uploading symbols
The main workflow on this page above is applicable for standard Gradle builds. However, some apps use a different configuration or tooling (for example a build process other than Gradle). In these situations, the following options might be helpful for successfully uploading symbols.
Option : Upload symbols for library modules and external dependencies
This option can be helpful in the following situations:
- If you use a customized NDK build process within Gradle
- If your native libraries are built in a library/feature module or provided by a third-party
- If the automatic symbol uploading task is failing or you're seeing unsymbolicated crashes in the Crashlytics dashboard
The standard Crashlytics symbol upload task assumes that you're building your native libraries as part of your app module's Gradle build, using standard NDK build tools such as CMake.
However, if you're using a customized NDK build process within Gradle, or your native libraries are built in a library/feature module or provided by a third-party, you may need to explicitly specify the path to your unstripped libraries. To accomplish this, you can add the unstrippedNativeLibsDir property within the Crashlytics extension in your Gradle build file.
Make sure that you've completed the following initial tasks from the main workflow earlier on this page:
So that the automatic symbol uploading task can find your symbol information, add the following to your module (app-level) Gradle file (usually
<project>/<app-module>/build.gradle.ktsor<project>/<app-module>/build.gradle):Kotlin
import com.google.firebase.crashlytics.buildtools.gradle.CrashlyticsExtension // ... android { // ... buildTypes { release { configure<CrashlyticsExtension> { nativeSymbolUploadEnabled = true unstrippedNativeLibsDir = file("PATH/TO/UNSTRIPPED/DIRECTORY") } } } }
Groovy
// ... android { // ... buildTypes { release { firebaseCrashlytics { nativeSymbolUploadEnabled true unstrippedNativeLibsDir file("PATH/TO/UNSTRIPPED/DIRECTORY") } } } }
The Crashlytics plugin will recursively search the specified directory for native libraries with a
.soextension. Crashlytics then extracts debugging symbols from all such libraries and uploads them to the Firebase servers.Here's what you can specify in the
unstrippedNativeLibsDirproperty:Any argument allowable for
org.gradle.api.Project#files(Object...), including:java.lang.String,java.io.File, ororg.gradle.api.file.FileCollectionMultiple directories for a single build flavor by providing a list or
FileCollectioninstance(Starting with Crashlytics Gradle plugin v3.0.0) Accumulate multiple directories in individual products and build flavors.
Finally, force a test crash to finish setting up Crashlytics and to see initial data in the Crashlytics dashboard of the Firebase console.
Option : Upload symbols for non-Gradle builds or inaccessible unstripped native libraries
This option can be helpful in the following situations:
If you use a build process other than Gradle
If your unstripped native libraries are provided to you in some way that they're not accessible during Gradle builds
This option requires that you run a Firebase CLI command when you create a release build or any build for which you want to see symbolicated stack traces in the Firebase console.
Make sure that you've completed the following initial tasks from the main workflow earlier on this page:
Added the Crashlytics SDK for NDK and the Crashlytics Gradle plugin .
Note that with this option, you don't need to add the
firebaseCrashlyticsextension or set up automatic symbol uploading because you'll instead use the Firebase CLI (next steps below) to generate and upload your symbol files.Set up your environment and project for symbol uploading:
Follow the instructions to install the Firebase CLI .
If you've already installed the CLI, make sure to update to its latest version .
(only for apps using Android API level 30+) Update your app's
AndroidManifest.xmltemplate to disable Pointer Tagging:Check the box for Android Player Settings > Publishing Settings > Build > Custom Main Manifest .
Open the manifest template located at
Assets/Plugins/Android/AndroidManifest.xml.Add the following attribute to the application tag:
<application android:allowNativeHeapPointerTagging="false" ... />
Build your project.
Upload your symbols information.
Once your build has finished, generate a Crashlytics -compatible symbol file and upload it to Firebase servers by running the following Firebase CLI command:
firebase crashlytics:symbols:upload --app=FIREBASE_APP_ID PATH/TO/SYMBOLS
FIREBASE_APP_ID : Ваш идентификатор приложения Firebase для Android (а не имя пакета).
Пример идентификатора Android-приложения Firebase:1:567383003300:android:17104a2ced0c9b9bВот два способа найти идентификатор вашего приложения Firebase:
В файле
google-services.jsonидентификатор вашего приложения — это значениеmobilesdk_app_id; илиВ консоли Firebase перейдите в настройки проекта . Перейдите к карточке «Ваши приложения» , затем щелкните нужное приложение Firebase, чтобы найти его идентификатор приложения.
PATH/TO/SYMBOLS : The path to the symbol file generated by the CLI
Exported to an Android Studio project — PATH/TO/SYMBOLS can be any directory. The Firebase CLI will recursively search the specified directory for native libraries with a
.soextension.Built the APK directly from within Unity — PATH/TO/SYMBOLS is the path of the zipped symbol file generated in the project root directory when your build finished (for example:
myproject/myapp-1.0-v100.symbols.zip).
View advanced options for using the Firebase CLI command for symbol file generation and upload
Флаг Описание --generator=csymUses the legacy cSYM symbol file generator instead of the default Breakpad generator
Not recommended for use. We recommend using the default Breakpad symbol file generator.
--generator=breakpadUses the Breakpad symbol file generator
Note that the default for symbol file generation is Breakpad. Only use this flag if you've added
symbolGenerator { csym() }in your build configuration and you want to override it to use Breakpad instead.--dry-runGenerates the symbol files but does not upload them
This flag is useful if you want to inspect the content of the files that are sent.
--debugProvides additional debugging information Finally, force a test crash to finish setting up Crashlytics and to see initial data in the Crashlytics dashboard of the Firebase console.
After you build your app as part of forcing a crash, make sure to run the Firebase CLI
crashlytics:symbols:uploadcommand to upload your symbol file.