Если ваше 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.4.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.3") 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.4" apply false // Add the dependency for the Crashlytics Gradle plugin id("com.google.firebase.crashlytics") version "3.0.6" 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.4' apply false // Add the dependency for the Crashlytics Gradle plugin id 'com.google.firebase.crashlytics' version '3.0.6' 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чтобы загрузить файл символов.