Wie deaktiviere ich Firebase Crash Reporting, wenn die App beim Debuggen ausgeführt wird?

74

Ich habe Firebase Crash Reporting erfolgreich implementiert, muss den Dienst jedoch deaktivieren, wenn die App ausgeführt wird, und die Build-Variante "Debuggen" rückgängig machen, um nicht echte Abstürze in der Konsole während der Entwicklung zu vermeiden.

Die offizielle Dokumentation sagt nichts darüber aus.

facundomr
quelle
if (!development) { FirebaseCrash.report(e);}
Ein Ohrwurm
1
Danke, @James_Parsons, aber das habe ich nicht so gemeint. Ich muss die automatische Absturzberichterstattung deaktivieren, nicht nur die manuellen Aufrufe der API.
Facundomr
releaseCompile 'com.google.firebase:firebase-crash:9.8.0' wird das nicht funktionieren? Es soll die Abhängigkeit nur für Ihre Release-Builds hinzufügen, daher wird die Entwicklung der Bibliothek während der Entwicklung nicht zum Projekt hinzugefügt, oder?
Ankit Mundada
Überprüfen Sie diese Antwort: stackoverflow.com/a/48384549/3166417
itzhar

Antworten:

48

AKTUALISIERT: Mit Google Play Services / Firebase 11+ können Sie jetzt die Absturzberichterstattung zur Laufzeit deaktivieren. FirebaseCrash.setCrashCollectionEnabled()(Danke @ Tyler Carberry )

ALTE ANTWORT:

Es gibt keine offizielle Unterstützung dafür, soweit die Community dies vermuten konnte. Der beste Weg, dies zu tun, besteht darin, mehrere Firebase-Apps in Ihrem Dashboard einzurichten, eine für jeden Build-Typ, und mehrere google_services.json-Dateien einzurichten, die je nach Build-Variante zu jeder unterschiedlichen App geleitet werden.

WoogieNoogie
quelle
22
Hallo, ich bin beim Crash Reporting Team. Wir möchten Ihnen eine Möglichkeit bieten, die Absturzberichterstattung programmgesteuert zu deaktivieren. Wir haben auch festgestellt, dass einige Entwickler in einigen Teilen der Welt aus rechtlichen Gründen keine Abstürze erfassen dürfen, und sie benötigen auch eine Möglichkeit, die Absturzberichterstattung zur Laufzeit zu deaktivieren.
Doug Stevenson
8
@DougStevenson Seit Ihrem Kommentar ist eine Weile vergangen, und ich finde anscheinend keine Möglichkeit, die automatische Absturzberichterstattung zu deaktivieren. Wie geht das im Moment?
Alin
5
Weitere Informationen zu dieser Antwort finden Sie unter: firebase.googleblog.com/2016/08/…
Frank
3
@ColinWhite Sorry, es ist noch nichts verfügbar. Wenn Sie Firebase auf Twitter (oder mir CodingDoug) folgen, werden Sie wahrscheinlich auf diese Weise von neuen Dingen erfahren.
Doug Stevenson
6
Mit Google Play Services 11.0 können Sie jetzt die Absturzberichterstattung zur Laufzeit deaktivieren. FirebaseCrash.setCrashCollectionEnabled (! BuildConfig.DEBUG);
Tyler Carberry
31

Mit Google Play Services 11.0 können Sie jetzt die Absturzberichterstattung zur Laufzeit deaktivieren.

FirebaseCrash.setCrashCollectionEnabled(!BuildConfig.DEBUG);
Tyler Carberry
quelle
24

Kürzlich wurde die Möglichkeit eingeführt, die Firebase-Absturzberichterstattung auf offizielle Weise zu deaktivieren. Sie müssen die Firebase Android SDK auf mindestens Version 11.0.0 aktualisieren

Dazu müssen Sie Ihre bearbeiten AndroidManifest.xmlund hinzufügen:

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

Im <application>Block.

Mit FirebaseCrash.isCrashCollectionEnabled () können Sie überprüfen, ob der Firebase-Absturzbericht zur Laufzeit aktiviert ist .

Unten finden Sie ein vollständiges Beispiel zum Deaktivieren der Firebase-Absturzberichterstattung in Ihren Debug-Builds.

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"/>
...
evi
quelle
Funktioniert das Flag firebase_crash_collection_enabledfür Version 9.2.1 von Firebase?
rraallvv
@rraallvv nein, die Funktion war noch nicht verfügbar
evi
Dies ist eine großartige Lösung und basiert auf dem dokumentierten Mechanismus für behinderte Crashlytics. Der Manifestschlüssel lautet jetzt übrigens 'firebase_crashlytics_collection_enabled'.
Leon
@Leon, sorry Kumpel, du liegst falsch. Dieser Ansatz ist de facto ein Android-Standard zum Aktivieren / Deaktivieren von Dingen im Manifest. Die Tatsache, die dem in der Crashlytics-Dokumentation verwendeten Ansatz ähnelt, ist völlig zufällig!
Evi
Nicht "firebase_crash_collection_enabled", sondern "firebase_crashlytics_collection_enabled" - von firebase.google.com/docs/crashlytics/customize-crash-reports
Alex Shevelev
11

in meiner Anwendungsklasse 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
        }
    });
}

Es funktioniert, weil es den alten Handler braucht, der den Firebase enthält

 final UncaughtExceptionHandler oldHandler = Thread.getDefaultUncaughtExceptionHandler();

aus dem Verarbeitungspfad

Marc
quelle
11

Sie können die Firebase-Crash-Abhängigkeit in eine Release-Abhängigkeit ändern.

Dazu definieren Sie es als releaseCompile-Abhängigkeit

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

Jetzt wird es nur noch in den Release-Builds enthalten sein. Wenn Sie andere benutzerdefinierte Build-Typen haben, für die Sie Absturzberichte erstellen möchten, können Sie diese hinzufügen.

customBuildTypeCompile 'com.google.firebase:firebase-crash:9.4.0'
Martin Wallgren
quelle
5
Selbst mit dieser Methode scheint Firebase alle Abstürze in einer Datenbank zu speichern. Wenn Sie jemals eine Release-Version auf Ihrem Emulator installieren (um beispielsweise ProGuard zu testen), werden ALLE gespeicherten Abstürze hochgeladen.
Joel
9

Der einfache Trick, den ich verwendet habe, besteht darin, die Abhängigkeit von Firebase-Absturzberichten in Release-Builds nur in build.gradleDateien hinzuzufügen .

Dadurch wird die Crash-Reporting-Bibliothek aus dem Debug-Build-Typ entfernt und nur im Release-Build hinzugefügt.

dependencies {
    releaseCompile 'com.google.firebase:firebase-crash:10.2.0'
}
Keval Patel
quelle
7

Inspiriert von dieser verwandten Antwort und anderen hier, habe ich diese praktische Lösung gefunden.

Mit Timber für die Protokollierung habe ich verschiedene Implementierungen einer Tree-Unterklasse für Debug- und Release-Builds erstellt. Beim Debuggen wird auf DebugTree verschoben, das in logcat schreibt. In der Version werden Ausnahmen und Protokolle mit hoher Priorität an Firebase weitergeleitet, der Rest wird gelöscht.

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

App-Start

Timber.plant(new ForestFire());
Travis Christian
quelle
6

Initialisieren Sie zuerst die Variablen in der Gradle-Datei und prüfen Sie, ob sie sich im Debug- oder im Release-Modus befinden. Der Absturzbericht kann am besten in der Anwendungsklasse eingereicht werden.

Build.gradle

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

Überprüfen Sie nun zuerst den Modus und senden Sie den Absturzbericht, falls er abgestürzt ist.

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);
            }
        }
    });
jazzbpn
quelle
9
Für den ersten Teil können Sie einfach BuildConfig.DEBUG
Bronx
4

Derzeit können Sie die Firebase-Absturzberichterstattung nicht deaktivieren, obwohl Sie die Firebase-Analyse deaktivieren können.

Eine Möglichkeit, dies zu tun, besteht darin, eine andere App mit einer anderen ID innerhalb desselben Firebase-Projekts zu erstellen. Danach müssen Sie nur noch die AppID ändern, um die Firebase-Absturzberichterstattung zu aktivieren oder zu deaktivieren. Ich habe unten zwei Apps für meine Bequemlichkeit erstellt:

AppID: com.android - Für den Release-Build-Typ

AppID: com.android.debug - Für den Debug-Build-Typ

Bitte folgen Sie dem Link unten für weitere Details:

https://firebase.googleblog.com/2016/08/organizing-your-firebase-enabled-android-app-builds.html

Bearbeiten: Sie müssen die AppID im Android-Projekt nicht immer wieder ändern. Es gibt eine bessere Möglichkeit, unterschiedliche AppIDs für den Debug-Build-Typ zu verwenden.

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

Überprüfen Sie den Link für weitere Details:

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

Edit2:

Grundsätzlich erstellen Sie in der obigen Lösung zwei verschiedene Apps im Firebase-Projekt. Auf diese Weise können Sie Ihre Entwicklungs- und Produktionsfehler trennen.

FYI Firebase-Absturzberichte sind veraltet. Sie sollten Fabrics Crashlytics (im Besitz von Google) verwenden. Es hat einige wirklich coole Funktionen.

Vipul Kumar
quelle
2

Für den FirebaseAnalyticsUnterricht.
Sammlung setAnalyticsCollectionEnabled(false);
deaktivieren: Sammlung aktivieren: setAnalyticsCollectionEnabled(true); oder AndroidManifest.xmlin das Anwendungs-Tag schreiben :<meta-data android:name="firebase_analytics_collection_enabled" android:value="false" />

Mögliche Verwendung:

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

Quelle

t0m
quelle
1

Zuerst müssen Sie Varianten erstellen debugund releaseerstellen und dann eine Variable mit einem booleschen Wert festlegen. Dann müssen Sie diesen Wert aus Ihrer Java-Datei abrufen, die sich erweitert, applicationdh von wo aus Sie die FabricAbsturzberichterstattung aktivieren .

Ein Codebeispiel ist unten angegeben.

In Ihrem App - build.gradleDatei fügen Sie die folgenden Zeilen 2 Build - Varianten zu erstellen debugund releasedann eine Variable mit boolean Wert hinzuzufügen.

defaultConfig {
    buildConfigField 'boolean', 'ENABLE_ANALYTICS', 'true'
}

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

Wenn Sie dann versuchen, Absturzberichte hinzuzufügen Fabric, überprüfen Sie den Wert fürENABLE_ANALYTICS

Test der öffentlichen Klasse erweitert Anwendung {

private GoogleAnalytics googleAnalytics;
private static Tracker tracker;

@Override
public void onCreate() {
    super.onCreate();
    if (BuildConfig.ENABLE_ANALYTICS)
        Fabric.with(this, new Crashlytics());
    }
}

Sie können den Wert für ENABLE_ANALYTICSdurch ctrl+ Klicken auf den Wert sehen. Hoffe das hilft.

Viper
quelle
1

Die einfachste Lösung für Benutzer, wenn sie die App im Debug- Modus oder im Release- Modus ausführen :

AndroidManifest.xml:

<meta-data
            android:name="firebase_crash_collection_enabled"
            android:value="${analytics_deactivated}"/>

build.gradle (Modul: App)

buildTypes {

        debug {
            manifestPlaceholders = [analytics_deactivated: "false"]
        }

        release {
            manifestPlaceholders = [analytics_deactivated: "true"]

        }
    }

Wenn sich die App im Release- Modus befindet, werden die Crashlatics aktiviert und die App wird im Debug- Modus ausgeführt. Sie wird dann deaktiviert .

Prajwal Waingankar
quelle
0

Ich benutze versionCodeals Filter für lokale / Produktions-Builds.

gradle.properties

VERSION_CODE=1

app / build.gradle

android {
    defaultConfig {
        versionCode VERSION_CODE as int
    }
}

Wenn Sie eine neue Version der App veröffentlichen, legen Sie einfach einen neuen Wert über die Befehlszeile fest:

./gradlew build -PVERSION_CODE=new_value

Andernfalls erhalten Sie beim Erstellen von Android Studio immer das Gleiche versionCode, sodass Sie Absturzberichte in der Firebase-Konsole leicht unterscheiden können.

Oleksii K.
quelle
0

Wie bereits gesagt, gibt es keinen offiziellen Weg, dies zu tun. Die schlechteste Problemumgehung für mich, wie bei @ mark-d erwähnt, ist das Zurücksetzen DefaultUncaughtExceptionHandler( https://stackoverflow.com/a/39322734/4245651 ).

Wenn Sie jedoch nur System.exit(2)wie vorgeschlagen anrufen , wird die App in Ausnahmefällen sofort geschlossen, ohne dass eine Dialogmeldung angezeigt wird und Debug-Protokolle nur schwer abgerufen werden können. Wenn dies für Sie wichtig ist, gibt es eine Möglichkeit, den Standardhandler wiederherzustellen:

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

Wo

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;
}
Roman_D
quelle
0
public class MyApp extends Application {
    public static boolean isDebuggable;

    public void onCreate() {
        super.onCreate();
        isDebuggable = (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE));
        FirebaseCrash.setCrashCollectionEnabled(!isDebuggable);
    }
}
Hamzeh Soboh
quelle