firebasecrash android firebase firebase-crash-reporting

android - firebasecrash - firebase crashlytics web



¿Cómo deshabilitar Firebase Crash Reporting cuando la aplicación se ejecuta en depuración? (14)

He implementado con éxito Firebase Crash Reporting, pero necesito deshabilitar el servicio cuando la aplicación se está ejecutando deshacer la variante de compilación ''depurar'' para evitar bloqueos no reales en la consola durante el desarrollo.

La documentación oficial no dice nada al respecto.


ACTUALIZADO: Con los servicios de Google Play / Firebase 11+ ahora puede deshabilitar los informes de fallas en tiempo de ejecución. FirebaseCrash.setCrashCollectionEnabled() (Gracias @Tyler Carberry )

ANTIGUA RESPUESTA:

No hay apoyo oficial para esto, hasta donde la comunidad ha podido suponer. La mejor forma en que sugeriría hacer esto es configurar varias aplicaciones de Firebase en su tablero, una para cada tipo de compilación, y configurar múltiples archivos google_services.json que dirijan a cada aplicación diferente dependiendo de la variante de compilación.


Actualmente no puede deshabilitar los informes de fallas de Firebase, aunque puede desactivar el análisis de Firebase.

Entonces, una forma de hacerlo es crear otra aplicación con una ID diferente dentro del mismo proyecto de Firebase. Después de esto, solo necesita cambiar la ID de aplicación para habilitar o deshabilitar los informes de fallas de Firebase. Creé a continuación dos aplicaciones para mi conveniencia:

AppID: com.android - Para el tipo de compilación de lanzamiento

ID de aplicación: com.android.debug : para el tipo de compilación de depuración

Siga el siguiente enlace para obtener más detalles:

firebase.googleblog.com/2016/08/…

Editar: no necesita cambiar la ID de aplicación en el proyecto de Android una y otra vez. Hay una mejor manera de usar diferentes ID de aplicación para el tipo de compilación de depuración.

android { defaultConfig { applicationId "com.android" ... } buildTypes { debug { applicationIdSuffix ".debug" } } }

Consulte el enlace para más detalles:

https://developer.android.com/studio/build/application-id.html

Edit2:

Básicamente, en la solución anterior, está creando dos aplicaciones diferentes en el proyecto Firebase, y de esta manera puede separar sus errores de desarrollo y producción.

El informe de fallas de Firebase FYI está en desuso. Debe usar Fabrics Crashlytics (propiedad de Google). Tiene algunas características realmente geniales.


Como se ha dicho antes, no hay una forma oficial de hacerlo. Pero la peor solución para mí como mencioné @ mark-d es restablecer DefaultUncaughtExceptionHandler ( https://.com/a/39322734/4245651 ).

Pero si solo llama a System.exit(2) como se sugirió, la aplicación se cerrará instantáneamente con excepción, sin ningún mensaje de diálogo y sin obtener registros de depuración. Si esto es importante para usted, hay una manera de restaurar el controlador predeterminado:

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); } }

Dónde

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; }


Con Google Play Services 11.0 ahora puede deshabilitar los informes de fallas en tiempo de ejecución.

FirebaseCrash.setCrashCollectionEnabled(!BuildConfig.DEBUG);


El truco simple y fácil que utilicé es agregar dependencia de informes de fallas de Firebase en la versión de compilación solo en el archivo build.gradle .

Esto eliminará la biblioteca de informes de fallas del tipo de compilación de depuración y agregará esto solo en la compilación de lanzamiento.

dependencies { releaseCompile ''com.google.firebase:firebase-crash:10.2.0'' }


Inspirado por esta respuesta relacionada y otras aquí, se me ocurrió esta práctica solución.

Usando Timber para iniciar sesión, creé diferentes implementaciones de una subclase de Tree para depurar y liberar compilaciones. En la depuración, difiere a DebugTree que escribe en logcat. En el lanzamiento, reenvía excepciones y registros de alta prioridad a Firebase, eliminando el resto.

build.gradle

dependencies { ... compile ''com.jakewharton.timber:timber:4.3.0'' releaseCompile ''com.google.firebase:firebase-crash:9.0.2'' }

src / debug / java / [paquete] /ForestFire.java

import timber.log.Timber; public class ForestFire extends Timber.DebugTree {}

src / release / java / [paquete] /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); } } } }

Inicio de la aplicación

Timber.plant(new ForestFire());


Para la clase FirebaseAnalytics .
Deshabilitar colección: setAnalyticsCollectionEnabled(false);
Habilitar colección: setAnalyticsCollectionEnabled(true); o escriba a AndroidManifest.xml en la etiqueta de la aplicación: <meta-data android:name="firebase_analytics_collection_enabled" android:value="false" />

Posible uso:

if (BuildConfig.DEBUG){ //disable for debug mFirebaseAnalytics.setAnalyticsCollectionEnabled(false); }

Source


Primero inicialice las variables en el archivo gradle y verifique si está en modo de depuración o de liberación. La mejor manera de enviar el informe de bloqueo es dentro de la clase Aplicación.

Build.gradle

buildTypes { release { buildConfigField "Boolean", "REPORT_CRASH", ''"true"'' debuggable false } debug { buildConfigField "Boolean", "REPORT_CRASH", ''"false"'' debuggable true } }

Ahora primero verifique el modo y envíe el informe de bloqueo si falla.

Application.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); } } });


Primero tendrá que crear una release debug y release variantes de compilación y luego establecer una variable con valor booleano. Entonces necesitará obtener ese valor de su archivo java que extiende la application es decir, desde donde habilita los informes de fallas de Fabric .

Un ejemplo de código se da a continuación.

En el archivo build.gradle su aplicación, agregue las siguientes líneas para crear 2 variantes de compilación de debug y release y luego agregue una variable con valor booleano.

defaultConfig { buildConfigField ''boolean'', ''ENABLE_ANALYTICS'', ''true'' } buildTypes { debug { applicationIdSuffix ".debug" versionNameSuffix ''DEBUG'' buildConfigField ''boolean'', ''ENABLE_ANALYTICS'', ''false'' } release { minifyEnabled false } }

Luego, cuando intente agregar informes de ENABLE_ANALYTICS Fabric , verifique el valor de ENABLE_ANALYTICS

Test de clase pública extiende la aplicación {

private GoogleAnalytics googleAnalytics; private static Tracker tracker; @Override public void onCreate() { super.onCreate(); if (BuildConfig.ENABLE_ANALYTICS) Fabric.with(this, new Crashlytics()); } }

Puede ver el valor de ENABLE_ANALYTICS mediante ctrl + clic en el valor. Espero que esto ayude.


Puede cambiar la dependencia de bloqueo de Firebase a una dependencia de solo liberación.

Para hacer esto, lo define como una dependencia de ReleaseCompile

releaseCompile ''com.google.firebase:firebase-crash:9.4.0''

Ahora solo se incluirá en las versiones de lanzamiento. Si tiene otros tipos de compilación personalizados para los que desea informes de fallas, puede agregarlos a ellos.

customBuildTypeCompile ''com.google.firebase:firebase-crash:9.4.0''


Uso versionCode como filtro para compilaciones locales / de producción.

gradle.properties

VERSION_CODE=1

app / build.gradle

android { defaultConfig { versionCode VERSION_CODE as int } }

Al publicar una nueva versión de la aplicación, simplemente establezca un nuevo valor desde la línea de comando:

./gradlew build -PVERSION_CODE=new_value

De lo contrario, cuando esté compilando desde Android Studio, siempre obtendrá el mismo versionCode , por lo que podrá distinguir fácilmente los informes de fallas en la consola de Firebase.


en mi clase de aplicación, 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 } }); }

Funciona porque toma el OldHandler, que incluye el Firebase

final UncaughtExceptionHandler oldHandler = Thread.getDefaultUncaughtExceptionHandler();

fuera de la ruta de procesamiento


Recently se introdujo la posibilidad de deshabilitar los informes de fallas de Firebase de manera oficial. Debe actualizar el sdk de Android Firebase a al menos la versión 11.0.0

Para hacerlo, debe editar su AndroidManifest.xml y agregar:

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

Dentro del bloque <application> .

Puede verificar si el informe de bloqueo de Firebase está habilitado en tiempo de ejecución utilizando FirebaseCrash.isCrashCollectionEnabled() .

A continuación se muestra un ejemplo completo para deshabilitar los informes de fallas de Firebase en sus compilaciones de depuración.

build.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"/> ...


public class MyApp extends Application { public static boolean isDebuggable; public void onCreate() { super.onCreate(); isDebuggable = (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE)); FirebaseCrash.setCrashCollectionEnabled(!isDebuggable); } }