Получить отчеты о сбоях Android NDK

Если ваш Android приложение содержит собственные библиотеки , вы можете включить полную трассировку стеки и подробные отчеты о сбоях для вашего родного кода из Firebase Crashlytics с несколькими небольшими обновлениями для конфигурации сборки приложения. В этом руководстве описывается, как настроить отчеты о сбоях с помощью нового SDK Firebase Crashlytics.

Прежде чем вы начнете

Для начала настройки Crashlytics .

  1. В рамках этапа 2 (Добавить плагин Firebase Crashlytics для вашего приложения) , убедитесь , что ваше приложение использует Crashlytics Gradle плагин V2.4.0 +, которая позволяет загружать символы , используя только ваши необработанные бинарные файлы для создания symbolicated аварий.

Шаг 1: Обновите конфигурацию Gradle

В вашем приложении уровня build.gradle , объявить во время выполнения зависимости Crashlytics NDK:

Джава

apply plugin: 'com.android.application'
apply plugin: 'com.google.firebase.crashlytics'

dependencies {
  // ...

  // Import the BoM for the Firebase platform
  implementation platform('com.google.firebase:firebase-bom:28.4.1')

  // Declare the dependency for the Firebase Crashlytics NDK library.
  // If you previously declared the Firebase Crashlytics dependency, replace it.
  // When using the BoM, you don't specify versions in Firebase library dependencies
  implementation 'com.google.firebase:firebase-crashlytics'
  implementation 'com.google.firebase:firebase-crashlytics-ndk'
  implementation 'com.google.firebase:firebase-analytics'
}

// …
android {
  // ...
  buildTypes {
      release {
          // Add this extension
          firebaseCrashlytics {
              // Enable processing and uploading of native symbols to Crashlytics 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
          }
      }
  }
}

С помощью Firebase Android Банка Москвы , ваше приложение будет всегда использовать совместимые версии библиотек Firebase Android.

(Альтернативный) Объявляет Firebase библиотеки зависимостей без использования спецификации

Если вы решите не использовать Firebase BoM, вы должны указать каждую версию библиотеки Firebase в ее строке зависимости.

Обратите внимание , что если вы используете несколько библиотеки Firebase в вашем приложении, мы настоятельно рекомендуем использовать спецификации для управления версиями библиотеки, что гарантирует , что все версии совместимы.

  dependencies {
      // Declare the dependency for the Firebase Crashlytics NDK library.
      // If you previously declared the Firebase Crashlytics dependency, replace it.
      // When NOT using the BoM, you must specify versions in Firebase library dependencies
      implementation 'com.google.firebase:firebase-crashlytics:18.2.1'
      implementation 'com.google.firebase:firebase-crashlytics-ndk:18.2.1'
      implementation 'com.google.firebase:firebase-analytics:19.0.1'
  }
  

Котлин + KTX

apply plugin: 'com.android.application'
apply plugin: 'com.google.firebase.crashlytics'

dependencies {
  // ...

  // Import the BoM for the Firebase platform
  implementation platform('com.google.firebase:firebase-bom:28.4.1')

  // Declare the dependency for the Firebase Crashlytics NDK library.
  // If you previously declared the Firebase Crashlytics dependency, replace it.
  // When using the BoM, you don't specify versions in Firebase library dependencies
  implementation 'com.google.firebase:firebase-crashlytics-ktx'
  implementation 'com.google.firebase:firebase-crashlytics-ndk'
  implementation 'com.google.firebase:firebase-analytics-ktx'
}

// …
android {
  // ...
  buildTypes {
      release {
          // Add this extension
          firebaseCrashlytics {
              // Enable processing and uploading of native symbols to Crashlytics 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
          }
      }
  }
}

С помощью Firebase Android Банка Москвы , ваше приложение будет всегда использовать совместимые версии библиотек Firebase Android.

(Альтернативный) Объявляет Firebase библиотеки зависимостей без использования спецификации

Если вы решите не использовать Firebase BoM, вы должны указать каждую версию библиотеки Firebase в ее строке зависимости.

Обратите внимание , что если вы используете несколько библиотеки Firebase в вашем приложении, мы настоятельно рекомендуем использовать спецификации для управления версиями библиотеки, что гарантирует , что все версии совместимы.

  dependencies {
      // Declare the dependency for the Firebase Crashlytics NDK library.
      // If you previously declared the Firebase Crashlytics dependency, replace it.
      // When NOT using the BoM, you must specify versions in Firebase library dependencies
      implementation 'com.google.firebase:firebase-crashlytics-ktx:18.2.1'
      implementation 'com.google.firebase:firebase-crashlytics-ndk:18.2.1'
      implementation 'com.google.firebase:firebase-analytics-ktx:19.0.1'
  }
  

Требуется для Crashlytics NDK версии 17.3.0: Если ваше приложение использует targetSdkLevel 30 или выше, вы должны также отключить функцию указателя мечения в приложении, добавив следующие строки в AndroidManifest.xml :

<application android:allowNativeHeapPointerTagging="false">
...
</application>

Для получения более подробной информации ознакомьтесь с поддержкой разработчиков для Меченых указателей .

Шаг 2: Разрешить загрузку родной символ

Чтобы получить читаемые трассировки стека при сбоях NDK, Crashlytics необходимо знать о символах в ваших собственных двоичных файлах. Наш Gradle плагин включает uploadCrashlyticsSymbolFile BUILD_VARIANT задачи автоматизировать этот процесс (для доступа к этой задаче, убедитесь , что nativeSymbolUploadEnabled устанавливается истина).

Для имен методов появляться в вашей трассировке стеки, вы должны явно вызвать uploadCrashlyticsSymbolFile BUILD_VARIANT задачу после каждой сборки вашей библиотеки НКА. Например:

>./gradlew app:assembleBUILD_VARIANT\
           app:uploadCrashlyticsSymbolFileBUILD_VARIANT

Crashlytics NDK v17.3.0 + и Gradle v2.4.1 + зависят от наличия идентификатора сборки GNU в собственных общих объектах. Вы можете проверить наличие этого идентификатора, запустив readelf -n на каждом двоичном. Если сборка идентификатор отсутствует, добавьте -Wl,--build-id для флажков вашей системы сборки, чтобы решить эту проблему.

Шаг 3 (необязательно): Загрузить символы для библиотеки модулей и внешних зависимостей

Наша задача загрузки символов предполагает, что вы создаете собственные библиотеки как часть сборки Gradle вашего модуля приложения, используя стандартные инструменты сборки NDK, такие как CMake. Если вы используете настраиваемый процесс сборки NDK в Gradle, или ваши собственные библиотеки встроены в модуль библиотеки / функции или предоставлены третьей стороной, вам может потребоваться явно указать путь к вашим незастроенным библиотекам. firebaseCrashlytics расширение предоставляет свойство unstrippedNativeLibsDir , чтобы сделать это.

Добавьте следующие строки в приложении уровень build.gradle файл:

// …
android {
    // ...
    buildTypes {
        release {
            firebaseCrashlytics {
                nativeSymbolUploadEnabled true
                unstrippedNativeLibsDir file("path/to/unstripped/dir")
            }
        }
    }
}

Плагин Crashlytics будет искать указанный каталог и все его подкаталоги для собственных библиотек с .so расширением. Затем Crashlytics извлечет символы отладки из всех таких библиотек и загрузит их на серверы Firebase.

unstrippedNativeLibsDir свойство принимает любые аргументы , допустимые для org.gradle.api.Project#files(Object...) , в том числе java.lang.String , java.io.File и org.gradle.api.file.FileCollection . Вы можете указать несколько каталогов для одного сборки вкуса, предоставляя список или FileCollection экземпляр.

Шаг 4 (дополнительно): отчеты о сбоях Настройка NDK

Вы необязательно может включать в себя crashlytics.h заголовок в вашем C ++ код для добавления метаданных отчетов о сбоях НДК, таких как журналы, пользовательские ключи и идентификаторы пользователей. crashlytics.h доступен в качестве заголовка-только C ++ библиотеки в Firebase Android SDK GitHub Repository . Прочтите комментарии в файле заголовка для получения инструкций по использованию API-интерфейсов NDK C ++.

Шаг 5 ( по желанию): Включить Breakpad символьный файл для symbolication

Плагин Crashlytics Gradle предоставляет следующие функциональные возможности:

  • Обрабатывает ваши нераспакованные собственные двоичные файлы для создания файлов символов.
  • Загружает сгенерированные файлы символов на наши серверы, чтобы использовать их позже при символировании собственных сбоев.

Плагин Crashlytics Gradle поддерживает два типа форматов файлов символов:
файл Crashlytics символ (cSYM) и Breakpad символьный файл.

Файл символов, созданный с помощью Breakpad, содержит больше информации, чем файл символов, созданный Crashlytics, включая информацию о кадре вызова (CFI), которая используется в процессе раскрутки для помощи в вычислении кадров стека. Использование CFI приведет к более точной трассировке стека, особенно для высокооптимизированных приложений, таких как игры и мультимедийные приложения.

Вы можете включить использование генератора файлов символов на основе Breakpad одним из двух способов:

  • Вариант 1: Включить через firebaseCrashlytics расширения в вашем build.gradle файле

    Добавьте следующие строки в приложении уровень build.gradle файл:

    android {
      // ...
      buildTypes {
        // ...
        release {
          // ...
          firebaseCrashlytics {
            // existing; required for either symbol file generator
            nativeSymbolUploadEnabled true
            // Add this optional new block to specify breakpad() or csym()
            symbolGenerator {
               breakpad()
            }
          }
        }
      }
    }
    

    Чтобы вернуться к генератору файлов символов Crashlytics по умолчанию, вы можете выполнить одно из следующих действий:

    • Опускает symbolGenerator блок целиком, так как плагин использует генератор файлов символа Crashlytics по умолчанию.

    • Держите блок, но изменение breakpad() в csym() .

  • Вариант 2: Включить через свойство строки в свойствах файла Gradle

    Вы можете использовать com.google.firebase.crashlytics.symbolGenerator свойство управления , который генератор символьного файла для использования. Допустимые значения свойств являются breakpad или csym . Если параметр не задан, то текущее значение по умолчанию эквивалентно csym , хотя это может измениться в версиях будущих.

    Вы можете вручную обновить файл свойств Gradle или обновить файл через командную строку. Например, чтобы включить генератор Breakpad файла символ, задайте значение breakpad , как показано в следующей команде:

    ./gradlew -Pcom.google.firebase.crashlytics.symbolGenerator=breakpad \
    app:assembleRelease app:uploadCrashlyticsSymbolFileRelease
    

Шаг 6: Смотрите ваши отчеты о сбоях

Убедитесь, что Crashlytics правильно сообщает о сбоях NDK, создавая ваше приложение, загружая символы и вызывая собственный сбой. Вам нужно будет перезапустить приложение после сбоя, чтобы Crashlytics отправил отчет. Вы должны увидеть аварию в вашей Firebase консоли в течение нескольких минут.

Исправление проблем

Если вы видите различные следы стека в Firebase консоли и в LogCat, обратитесь к руководству по устранению неисправностей .