Если ваше Android-приложение содержит собственные библиотеки , вы можете включить полную трассировку стека и подробные отчеты о сбоях для вашего собственного кода из Firebase Crashlytics внеся несколько небольших изменений в конфигурацию сборки вашего приложения.
В этом руководстве описывается, как настроить отчеты о сбоях с помощью Firebase Crashlytics SDK для NDK.
Если вы ищете, как начать работу с Crashlytics в своих проектах Unity, ознакомьтесь с руководством по началу работы с Unity .
Прежде чем начать
Добавьте Firebase в свой проект Android, если вы ещё этого не сделали. Если у вас нет приложения для Android, вы можете скачать пример приложения .
Рекомендуется : для автоматического получения журналов хлебных крошек для понимания действий пользователя, приводящих к сбою, нефатальному событию или событию ANR, вам необходимо включить Google Analytics в вашем проекте Firebase.
Если в вашем существующем проекте Firebase не включен Google Analytics , вы можете включить Google Analytics на вкладке «Интеграции» вашего проекта.
Firebase . > Настройки проекта в консолиЕсли вы создаете новый проект Firebase, включите Google Analytics во время процесса создания проекта.
Убедитесь, что ваше приложение имеет следующие минимальные требуемые версии:
- 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.0.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.0.0") implementation("com.google.firebase:firebase-analytics:23.0.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.4.3" apply false // Add the dependency for the Crashlytics Gradle plugin id("com.google.firebase.crashlytics") version "3.0.5" 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.4.3' apply false // Add the dependency for the Crashlytics Gradle plugin id 'com.google.firebase.crashlytics' version '3.0.5' 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 необходимо знать о символах в ваших нативных исполняемых файлах. Плагин Gradle Crashlytics включает задачу uploadCrashlyticsSymbolFile BUILD_VARIANT
для автоматизации этого процесса.
Чтобы получить доступ к задаче автоматической загрузки символов, убедитесь, что в файле Gradle вашего модуля (на уровне приложения) для параметра
nativeSymbolUploadEnabled
задано значениеtrue
.Чтобы имена методов отображались в трассировках стека, необходимо явно вызывать задачу
uploadCrashlyticsSymbolFile BUILD_VARIANT
после каждой сборки библиотеки NDK. Например:>./gradlew app:assembleBUILD_VARIANT\ app:uploadCrashlyticsSymbolFileBUILD_VARIANT
Как Crashlytics SDK для NDK, так и плагин Crashlytics Gradle зависят от наличия идентификатора сборки GNU в собственных общих объектах.
Вы можете проверить наличие этого идентификатора, запустив
readelf -n
для каждого исполняемого файла. Если идентификатор сборки отсутствует, добавьте-Wl,--build-id
к флагам вашей системы сборки, чтобы исправить проблему.
Шаг 5 : принудительное выполнение тестового сбоя для завершения настройки
Чтобы завершить настройку Crashlytics и увидеть начальные данные на панели управления Crashlytics консоли Firebase , необходимо принудительно выполнить тестовый сбой.
Добавьте в свое приложение код, который можно использовать для принудительного тестового сбоя.
Вы можете использовать следующий код в
MainActivity
вашего приложения, чтобы добавить кнопку, нажатие которой вызывает сбой. Кнопка называется «Тестовый сбой».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.
Перейдите на панель управления Crashlytics консоли Firebase , чтобы увидеть краш вашего теста.
Если вы обновили консоль и по прошествии пяти минут сбой теста так и не появился, включите ведение журнала отладки, чтобы проверить, отправляет ли ваше приложение отчеты о сбоях.
Вот и всё! 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 предполагает, что вы создаете собственные библиотеки как часть сборки 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 v3.0.0) Накапливайте несколько каталогов в отдельных продуктах и создавайте варианты.
buildTypes { release { configure<CrashlyticsExtension> { nativeSymbolUploadEnabled = true unstrippedNativeLibsDir = file("MY/NATIVE/LIBS") } } productFlavors { flavorDimensions += "feature" create("basic") { dimension = "feature" // ... } create("featureX") { dimension = "feature" configure<CrashlyticsExtension> { unstrippedNativeLibsDir = file("MY/FEATURE_X/LIBS") } } } }
Задача
uploadCrashlyticsSymbolFilesBasicRelease
загрузит символы только вMY/NATIVE/LIBS
, ноuploadCrashlyticsSymbolFilesFeatureXRelease
загрузит символы как вMY/NATIVE/LIBS
так иMY/FEATURE_X/LIBS
.Наконец, принудительно запустите тестовый сбой , чтобы завершить настройку Crashlytics и увидеть начальные данные на панели управления Crashlytics консоли Firebase .
Вариант : загрузка символов для сборок, отличных от Gradle, или недоступных неотредактированных собственных библиотек.
Эта опция может быть полезна в следующих ситуациях:
Если вы используете процесс сборки, отличный от Gradle
Если ваши неотредактированные нативные библиотеки предоставлены вам каким-то образом и они недоступны во время сборок Gradle
Этот параметр требует запуска команды Firebase CLI при создании сборки релиза или любой сборки, для которой вы хотите увидеть символьные трассировки стека в консоли Firebase .
Убедитесь, что вы выполнили следующие начальные задачи из основного рабочего процесса, описанного ранее на этой странице:
Добавлены Crashlytics SDK для NDK и плагин Crashlytics Gradle .
Обратите внимание, что при использовании этой опции вам не нужно добавлять расширение
firebaseCrashlytics
или настраивать автоматическую загрузку символов, поскольку вместо этого вы будете использовать Firebase CLI (следующие шаги ниже) для создания и загрузки файлов символов.Настройте среду и проект для загрузки символов:
Следуйте инструкциям по установке Firebase CLI .
Если вы уже установили CLI, обязательно обновите его до последней версии .
(только для приложений, использующих API Android уровня 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 (не имя вашего пакета)
Пример идентификатора приложения Firebase для Android:1:567383003300:android:17104a2ced0c9b9b
Вот два способа найти идентификатор приложения Firebase:
В файле
google-services.json
ваш идентификатор приложения — это значениеmobilesdk_app_id
; илиВ консоли Firebase перейдите в настройки проекта . Прокрутите вниз до карточки «Ваши приложения» , затем нажмите на нужное приложение Firebase, чтобы узнать его идентификатор.
PATH/TO/SYMBOLS : Путь к файлу символов, созданному CLI
Экспортировано в проект 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
, чтобы загрузить файл символов.