Как отключить отчеты о сбоях Firebase, когда приложение работает на отладке?
Я успешно реализовал Firebase Crash Reporting, но мне нужно отключить службу, когда приложение работает отменить вариант сборки "debug", чтобы избежать нереальных сбоев в консоли во время разработки.
в официальной документации об этом ничего не говорится.
14 ответов:
обновление: С помощью Google Play Services / Firebase 11+ Теперь вы можете отключить отчеты о сбоях во время выполнения.
FirebaseCrash.setCrashCollectionEnabled()
(спасибо @Tyler Carberry)ОТВЕТ:
нет никакой официальной поддержки для этого, насколько сообщество смогло догадаться. Лучший способ, который я бы предложил сделать это, - настроить несколько приложений Firebase на панели мониторинга, по одному для каждого типа сборки и настроить несколько google_services.JSON файлы, направляющие в каждое другое приложение в зависимости от варианта сборки.
С Google Play Services 11.0 теперь вы можете отключить отчеты о сбоях во время выполнения.
FirebaseCrash.setCrashCollectionEnabled(!BuildConfig.DEBUG);
недавно была введена возможность отключить Firebase crash reporting в официальном порядке. Вам необходимо обновить firebase android sdk по крайней мере до версии 11.0.0
для этого вам нужно отредактировать свой
AndroidManifest.xml
и добавить:<meta-data android:name="firebase_crash_collection_enabled" android:value="false" />
внутри
<application>
блок.вы можете проверить, включен ли отчет о сбое Firebase во время выполнения с помощью FirebaseCrash.isCrashCollectionEnabled ().
ниже a полный пример отключения отчетов о сбоях Firebase в отладочных сборках.
построить.gradle:
... buildTypes { release { ... resValue("bool", "FIREBASE_CRASH_ENABLED", "true") } debug { ... resValue("bool", "FIREBASE_CRASH_ENABLED", "false") } } ... dependencies { ... compile "com.google.firebase:firebase-core:11.0.0" compile "com.google.firebase:firebase-crash:11.0.0" ... }
AndroidManifest.xml:
<application> <meta-data android:name="firebase_crash_collection_enabled" android:value="@bool/FIREBASE_CRASH_ENABLED"/> ...
в моем классе приложений, onCreate ()
if (BuildConfig.DEBUG) { Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() { @Override public void uncaughtException(Thread paramThread, Throwable paramThrowable) { Log.wtf("Alert", paramThrowable.getMessage(), paramThrowable); System.exit(2); //Prevents the service/app from freezing } }); }
это работает, потому что он принимает oldHandler, который включает в себя Firebase one
final UncaughtExceptionHandler oldHandler = Thread.getDefaultUncaughtExceptionHandler();
из пути переработки
вы можете изменить зависимость сбоя firebase на зависимость только для выпуска.
для этого вы определяете его как зависимость releaseCompile
releaseCompile 'com.google.firebase:firebase-crash:9.4.0'
теперь он будет включен только в сборку выпуска. Если у вас есть другие пользовательские типы сборки, для которых вы хотите создавать отчеты о сбоях, вы можете добавить их к ним.
customBuildTypeCompile 'com.google.firebase:firebase-crash:9.4.0'
простой и легкий трюк, который я использовал, - это добавить зависимость от отчетов о сбоях firebase в сборке выпуска только в .
это удалит библиотеку отчетов о сбоях из типа сборки отладки и добавит ее только в сборку выпуска.
dependencies { releaseCompile 'com.google.firebase:firebase-crash:10.2.0' }
вдохновленный это связано ответа и другие здесь, я придумал это удобное решение.
используя Лесной для ведения журнала я создал различные реализации подкласса дерева для сборки debug и release. В debug он переносится на DebugTree, который записывает в logcat. В выпуске он пересылает исключения и высокоприоритетные журналы в Firebase, отбрасывая остальное.
построить.gradle
dependencies { ... compile 'com.jakewharton.timber:timber:4.3.0' releaseCompile 'com.google.firebase:firebase-crash:9.0.2' }
src/debug/java/[package] / ForestFire.java
import timber.log.Timber; public class ForestFire extends Timber.DebugTree {}
src / release/java/[package] / ForestFire.java
import android.util.Log; import com.google.firebase.crash.FirebaseCrash; import timber.log.Timber; public class ForestFire extends Timber.Tree { @Override protected void log(int priority, String tag, String message, Throwable t) { if (Log.WARN <= priority) { FirebaseCrash.log(message); if (t != null) { FirebaseCrash.report(t); } } } }
запуске приложения
Timber.plant(new ForestFire());
сначала инициализируйте переменные в файле gradle и проверьте, находится ли он в режиме отладки или в режиме выпуска. Лучший способ отправить отчет о сбое находится в классе приложения.
построить.gradle
buildTypes { release { buildConfigField "Boolean", "REPORT_CRASH", '"true"' debuggable false } debug { buildConfigField "Boolean", "REPORT_CRASH", '"false"' debuggable true } }
теперь сначала проверьте режим и отправить отчет об аварии, если разбился .
приложение.java
/** Report FirebaseCrash Exception if application crashed*/ Thread.setDefaultUncaughtExceptionHandler (new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException (Thread thread, Throwable e) { /** Check whether it is development or release mode*/ if(BuildConfig.REPORT_CRASH) { FirebaseCrash.report( e); } } });
В настоящее время вы не можете отключить Firebase crash reporting, хотя вы можете отключить firebase analytics.
таким образом, один из способов сделать это-создать другое приложение с другим идентификатором в том же проекте firebase. После этого вам просто нужно изменить appID, чтобы включить или отключить отчеты о сбоях firebase. Я создал два приложения для моего удобства:
AppID: com.android - по версии сборки типа
AppID: com.андроид.отладка - для отладка типа сборки
пожалуйста, перейдите по ссылке ниже для получения более подробной информации:
https://firebase.googleblog.com/2016/08/organizing-your-firebase-enabled-android-app-builds.html
Edit: Вам не нужно менять appID в проекте android снова и снова. Существует лучший способ использовать другой appID для отладки типа сборки -
android { defaultConfig { applicationId "com.android" ... } buildTypes { debug { applicationIdSuffix ".debug" } } }
Проверьте ссылку для получения дополнительной информации подробности:
https://developer.android.com/studio/build/application-id.html
Edit2:
в основном в вышеуказанном решении вы делаете два разных приложения в проекте Firebase, и таким образом вы можете отделить свои ошибки разработки и производства.
к вашему сведению военнослужащих отчетности аварии является устаревшим. Вы должны использовать Ткани Crashlytics (принадлежит Google). Он имеет некоторые действительно интересные функции.
на
FirebaseAnalytics
класса.
Отключить сбор:setAnalyticsCollectionEnabled(false);
Включить сбор:setAnalyticsCollectionEnabled(true);
или написать вAndroidManifest.xml
в теге приложения:<meta-data android:name="firebase_analytics_collection_enabled" android:value="false" />
возможно использование:
if (BuildConfig.DEBUG){ //disable for debug mFirebaseAnalytics.setAnalyticsCollectionEnabled(false); }
сначала вам придется создать
debug
иrelease
построить варианты, а затем установить переменную с логическим значением. Тогда вам нужно будет получить это значение из вашего java-файла, который расширяетapplication
т. е. Откуда вы включаетеFabric
сообщения об ошибках.пример кода приведен ниже.
в вашем приложении добавьте следующие строки, чтобы создать 2 варианта сборки
debug
иrelease
и затем добавить переменную типа boolean значение.defaultConfig { buildConfigField 'boolean', 'ENABLE_ANALYTICS', 'true' } buildTypes { debug { applicationIdSuffix ".debug" versionNameSuffix 'DEBUG' buildConfigField 'boolean', 'ENABLE_ANALYTICS', 'false' } release { minifyEnabled false } }
тогда, когда вы пытаетесь добавить
Fabric
отчет о сбое проверьте значениеENABLE_ANALYTICS
тест открытого класса расширяет применение {
private GoogleAnalytics googleAnalytics; private static Tracker tracker; @Override public void onCreate() { super.onCreate(); if (BuildConfig.ENABLE_ANALYTICS) Fabric.with(this, new Crashlytics()); } }
вы можете увидеть значение для
ENABLE_ANALYTICS
byctrl
+ щелчок на значении. Надеюсь, это поможет.
я использую
versionCode
как фильтр для локальных / производственных сборок.gradle.свойства
VERSION_CODE=1
приложения/строить.gradle
android { defaultConfig { versionCode VERSION_CODE as int } }
при публикации новой версии приложения, просто установите новое значение из командной строки:
./gradlew build -PVERSION_CODE=new_value
в противном случае, когда вы строите из Android Studio, вы всегда будете получать то же самое
versionCode
, Так что вы можете легко отличить отчеты о сбоях в консоли Firebase.
как уже было сказано ранее-нет официального способа сделать это. Но худший обходной путь для меня, как уже упоминалось @mark-d, - это сброс
DefaultUncaughtExceptionHandler
(https://stackoverflow.com/a/39322734/4245651).но если вы просто позвоните
System.exit(2)
как было предложено-приложение будет мгновенно закрыто на исключение, без каких-либо диалоговых сообщений и трудно получить журналы отладки. Если это важно для вас, есть способ восстановить по умолчанию обработчик:if (BuildConfig.DEBUG) { final Thread.UncaughtExceptionHandler currentHandler = Thread.getDefaultUncaughtExceptionHandler(); if (currentHandler.getClass().getPackage().getName() .startsWith("com.google.firebase")) { final Thread.UncaughtExceptionHandler defaultHandler = getPrivateFieldByType(currentHandler, Thread.UncaughtExceptionHandler.class); Thread.setDefaultUncaughtExceptionHandler(defaultHandler); } }
здесь
public static <T> T getPrivateFieldByType(Object obj, Class<T> fieldType) { if (obj != null && fieldType != null) { for (Field field : obj.getClass().getDeclaredFields()) { if (field.getType().isAssignableFrom(fieldType)) { boolean accessible = field.isAccessible(); if (!accessible) field.setAccessible(true); T value = null; try { //noinspection unchecked value = (T) field.get(obj); } catch (IllegalAccessException e) { e.printStackTrace(); } if (!accessible) field.setAccessible(false); return value; } } } return null; }