Firebase crashlytics не показывает сбои

Хотел получить отчет о сбое от Firebase, как только приложение выходит из строя. Можно ли разделить журналы режима отладки отдельно и журнал аварийного завершения производства в аварийном отказе Firebase?... потому что не совсем понятно, когда мы получаем аварийный отказ от производственного или отладочного теста. Кроме того, firebase не будет отображать отчет о сбое на консоли после сбоя. Что я должен сделать, чтобы получить актуальный отчет о сбое? Есть ли другой способ получить отчет о сбое, кроме пожарной базы? Я обновил библиотеки, необходимые для аварийного отключения Firebase. и последовавшее руководство - https://firebase.google.com/docs/crashlytics/get-started

8 ответов

Можно ли разделить журналы режима отладки отдельно и журнал аварийного завершения производства отдельно в случае сбоя Firebase?

Это обычная практика или, возможно, даже рекомендуется создавать отдельный проект для тестирования и производства. Загрузите и разместите google-services.json в папке сборки

  • ~/app/src/release/google-services.json
  • ~/app/src/debug/google-services.json

Даже если у вас есть только один проект Firebase для тестирования и производства, вы можете отфильтровать ваши журналы по идентификатору приложения, если вы настраиваете суффикс идентификатора проекта для разновидности сборки разработки:

~ / приложение /build.gradle

buildTypes {
  release {
  }
  debug {
    applicationIdSuffix '.debug'
    versionNameSuffix '-dbg'
  }
}

Здесь вы можете увидеть различные ароматы, доступные в Crashlytics

Кроме того, firebase не будет отображать отчет о сбое на консоли после сбоя.

В первый раз, когда вы настраиваете сбои, может пройти некоторое время, прежде чем данные появятся на панели мониторинга. Но если прошло более 24 часов, скорее всего, он не настроен должным образом. Попробуйте явно вызвать сбой, чтобы убедиться, что он работает нормально.

Button crashButton = new Button(this);
crashButton.setText("Crash!");
crashButton.setOnClickListener(new View.OnClickListener() {
    public void onClick(View view) {
        Crashlytics.getInstance().crash(); // Force a crash
    }
});

Есть ли другой способ получить отчет о сбое, кроме пожарной базы?

Да, у вас может быть несколько инструментов для отчетов о сбоях, если у вас есть такая необходимость. Возможно, вы можете создать класс-оболочку для отчетов о сбоях, где вы абстрагируете вызов Crashlytics и можете добавлять или изменять базовую платформу отчетов там.

Обновить SDK

После выполнения соответствующих настроек для перехода на новый SDK важно избежать следующей ошибки:

Попытка отправить отчет о сбое во время сбоя.

Это может быть вызвано принудительным сбоем (в моем случае без прослушивания кнопки) до того, как FirebaseCrashlytics отправит отчеты, то есть загрузка конечной точки отчетов Crashlytics завершена.


Реализация теста

Включить ведение журнала отладки Crashlytics

$ adb devices 
$ adb shell setprop log.tag.FirebaseCrashlytics DEBUG
$ adb logcat -s FirebaseCrashlytics

1) Первый шаг: НЕ вызывайте сбой и запускайте приложение. Наблюдая, как в Crashlyticis logcat он правильно инициализируется.

...
FirebaseCrashlytics: Update app request ID: 1d62cb...
FirebaseCrashlytics: Result was 204.
Crashlytics Reports Endpoint upload complete

2) Шаг второй: принудительное завершение работы (кнопкой или напрямую).

MainActivity.kt

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    setupCrashlytics()

    ...
 }

 private fun setupCrashlytics() {
     throw RuntimeException("Test crash")  //TODO: Clean
 }

Примечание. Единственное, что необходимо для создания отчета, - это этот код в дополнение к зависимостям. Кроме того, вы можете войти в пользовательские ключи с помощьюFirebaseCrashlytics.getInstance().

Затем запустите приложение и проверьте следующее:

FirebaseCrashlytics: Crashlytics completed exception processing. Invoking default exception handler.
FirebaseCrashlytics: Attempting to send crash report at time of crash...

На этом этапе процесс исключения регистрируется на сервере Firebase, но отчеты еще не отправлены на консоль, то есть загрузка не завершена.

3) Наконец, убираем или комментируем сбой.

private fun setupCrashlytics() {
     //throw RuntimeException("Test crash")
}

Запускаем приложение и проверим:

Attempting to send 1 report(s)
FirebaseCrashlytics: Settings result was: 200
FirebaseCrashlytics: Adding single file 5EDA9D7....cls to report 5EDA9D7...
FirebaseCrashlytics: Sending report to: https://reports.crashlytics.com/spi/v1/platforms/android/apps/.../reports
FirebaseCrashlytics: Crashlytics Reports Endpoint upload complete: 5EDABB42 ...

Это гарантирует, что отчет достиг консоли.

GL

Firebase не будет делать различий между журналами отладки и производственной версией / сбоями при сбое, если вы установили автоматический сбор журналов. Вы можете использовать библиотеку журналов для отправки журналов и аварий, только если приложение build.gradle имеет debug:fasle, т.е. production. Вы можете посмотреть библиотеку журналов Timber, в которой есть отличный пример добавления отчетов о сбоях. https://github.com/JakeWharton/timber

Вы должны отключить автоматическую инициализацию сбоев в манифесте, чтобы иметь возможность контролировать отправку сбоев в firebase

<meta-data
            android:name="firebase_crashlytics_collection_enabled"
            android:value="false" />

Тогда в вашем классе приложения onCreate Вы проверяете, если BuildConfig.DEBUG Это правда, что вы не будете инициализировать аварийные игры, поэтому ваши журналы отладки и исключения не попадут в базу данных, что приведет только к производственным сбоям.

Для древесины, когда вы хотите поместить бревна и сбои в базу огня, вы можете использовать это дерево:

/**
     * {@link Timber.Tree} using {@link Crashlytics} as crash reporting
     */
    private static class CrashReportingTree extends Timber.Tree {

        CrashReportingTree(Context context) {
            CrashlyticsCore core = new CrashlyticsCore.Builder()
                    .disabled(BuildConfig.DEBUG)
                    .build();
            Fabric.with(context, new Crashlytics.Builder().core(core).build());
        }

        @Override
        protected void log(int priority, String tag, @NonNull String message, Throwable t) {
            // don't report log to Crashlytics if priority is Verbose or Debug
            if (priority == Log.VERBOSE || priority == Log.DEBUG) {
                return;
            }
            Crashlytics.log(priority, tag, message);

            if (t != null) {
                if (priority == Log.ERROR) {
                    Crashlytics.logException(t);
                }
            }

        }
    }

Для режима отладки вы не должны отправлять сбои на firebase, так как вы можете проверить журналы отладки локально.

Удалите fabric.properties и удалите все линии и файлы, связанные с тканью.

В моем случае я сделал глупую ошибку:

      FirebaseCrashlytics.getInstance().setUserId(uid);

куда uidбыл еще нулевым.

Для меня проблемой был сам эмулятор. Установка даты и времени на эмуляторе сделала это за меня, так как это привело к CertificateNotYetValidException.

Я решаю эту проблему благодаря решению AllwinJohnson в: https://github.com/firebase/firebase-android-sdk/issues/1944

Добавив: FirebaseCrashlytics.getInstance() в моем onCreate в моем классе приложения

Это поможет, если вы перешли с Fabric SDK на Firebase Crashlytics.Добавьте приведенную ниже строку в OnCreate() , запустите приложение и проверьте панель управления сбоями firebase.

      FirebaseCrashlytics.getInstance().sendUnsentReports();
Другие вопросы по тегам