So deaktivieren Sie Crashlytics während der Entwicklung

245

Gibt es eine einfache Möglichkeit, das Crashlytics Android SDK während der Entwicklung auszuschalten?

Ich möchte nicht, dass es jedes Mal zum Absturz kommt, wenn ich etwas Dummes tue

Andererseits möchte ich nicht kommentieren Crashlytics.start()und riskiere möglicherweise zu vergessen, es zu kommentieren und zu verpflichten

Michael
quelle
Haben Sie versucht, nur Ihren API-Schlüssel aus dem Manifest zu entfernen? Ich erinnere mich nicht, ob das ein Absturz ist.
Timmetje
@timmied Es stürzt ab. Auch das Kommentieren der gesamten Zeile in den ManifestAbstürzen der App, so dass die Frage ein wenig legitimer wird.
Michael

Antworten:

172

Marc von Crashlytics hier. Hier sind einige Möglichkeiten, um Crashlytics zu deaktivieren, während Sie Ihre Debug-Builds ausführen!

  1. Verwenden Sie ein anderes Android: versionString für Debug- und Release-Builds und deaktivieren Sie dann die Crash-Berichterstellung über das Crashlytics-Web-Dashboard für die Debug-Version.

  2. Schließen Sie den Aufruf von Crashlytics.start () in eine if-Anweisung ein, die ein Debug-Flag überprüft. Sie können entweder ein benutzerdefiniertes Flag oder einen Ansatz wie den hier vorgeschlagenen verwenden: Wie kann überprüft werden, ob APK signiert ist oder "Build debuggen"?

marcr
quelle
5
@marcr Wie wäre es einfach mit BuildConfig.DEBUG?
Dannyya
3
@dannyroa BuildConfig.DEBUG ist kein Standardflag, das in allen Buildumgebungen funktioniert. Ich glaube, dass es beim Erstellen mit Eclipse & ADT konsistent festgelegt wird, aber nicht anderswo.
März
11
BuildConfig.DEBUGsollte verwendet werden, wenn Sie mit Gradle bauen. Es wird immer richtig generiert.
Austyn Mahoney
3
@marcr Wie wäre es mit der neuesten Version von Crashlytics (da es mit Fabric zusammengeführt zu sein scheint), führt die Bibliothek eine interne Überprüfung durch BuildConfig.DEBUG?
Akhy
2
@akhyar Es wird nicht automatisch überprüft, ich benutze: if (! BuildConfig.DEBUG) {Fabric.with (dies, neue Crashlytics ());}
Björn Kechel
387

Ich habe die Lösung von Crashlytics gefunden (mit Fabric-Integration)

Fügen Sie den folgenden Code in Ihre Anwendungsklasse ein onCreate()

Crashlytics crashlytics = new Crashlytics.Builder().disabled(BuildConfig.DEBUG).build();
Fabric.with(this, crashlytics);

BEARBEITEN:

In Crashalitics 2.3 und höher ist dies veraltet. Der richtige Code lautet:

CrashlyticsCore core = new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build();
Fabric.with(this, new Crashlytics.Builder().core(core).build());

oder

Fabric.with(this, new Crashlytics.Builder().core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()).build());

(kopiert von Crashlytics veraltete Methode deaktiviert () )


EDIT2:

Optional können Sie dies auch zu Ihrem buildTypeGradle hinzufügen. Dieser Befehl deaktiviert das Senden der Crashlytics-Zuordnungsdatei und das Generieren einer ID für jeden Build, wodurch Gradle-Builds dieser Varianten beschleunigt werden. (Crashlytics wird zur Laufzeit nicht deaktiviert.) Die Antwort von Mike B finden Sie hier.

buildTypes {
    release {
           ....
    }
    debug {
        ext.enableCrashlytics = false
    }
}
Xialin
quelle
2
Dies ist viel benutzerfreundlicher und verhindert, dass Ihre App abstürzt, wenn Sie Crashlytics in Ihrem Code außerhalb Ihrer Anwendungsklasse aufrufen.
Speedynomads
1
Es wurde in Crashlytics 2.3.0 veraltet :(
Damian Walczak
1
ext.enableCrashlytics = false funktioniert bei mir auch nicht mit 2.5. Eigentlich hat es nie funktioniert. Schon vor Stoff.
Bao-Long Nguyen-Trong
2
Ich habe hier Bedenken. Wird dies Answer und Beta ermöglichen? Es sieht so aus, als ob dies korrekter sein sollte: CrashlyticsCore core = new CrashlyticsCore.Builder (). Disabled (BuildConfig.DEBUG) .build (); Fabric.with (dies, neue Answers (), neue Beta (), neue Crashlytics.Builder (). Core (core) .build ());
Gbero
1
ext.enableCrashlytics = false stürzt nicht ab, wenn Sie dies richtig verwenden. Informationen zur Überwindung des Absturzes finden Sie in der Fabrics-Dokumentation: docs.fabric.io/android/crashlytics/build-tools.html .
Frank
46

Die gewählte Antwort ist nicht mehr richtig. Google hat die Integration von Crashlytics geändert. Meine aktuelle Version ist 2.9.1und das einzige, was ich tun musste, war, sie implementation 'com.crashlytics.sdk.android:crashlytics:2.9.1'zu meiner Gradle-Datei hinzuzufügen . Keine weiteren Dinge erforderlich, schön, aber das bedeutet, dass Crashlytics immer läuft.

Lösung 1

Kompilieren Sie Crashlytics nur in der Release-Version:

dependencies {
   ...
   releaseImplementation 'com.crashlytics.sdk.android:crashlytics:2.9.1' // update version
}

Lösung 2

Wenn Sie Crashlytics zusätzlich konfigurieren möchten, funktioniert Lösung 1 nicht, da die Crashlytics-Klassen in Debug-Builds nicht gefunden werden. Ändern Sie die Gradle-Implementierung wieder in:

implementation 'com.crashlytics.sdk.android:crashlytics:2.9.1' // update version

Gehen Sie dann zu Ihrem Manifest und fügen Sie das folgende meta-dataTag in das applicationTag ein:

<application
        android:name="...>

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

...

</application>

Zu Ihrer Startaktivität hinzufügen (nur einmal erforderlich, nicht jede Aktivität)

if (!BuildConfig.DEBUG) { // only enable bug tracking in release version
   Fabric.with(this, new Crashlytics());
}

Dies aktiviert Crashlytics nur in Release-Versionen. Seien Sie vorsichtig, suchen Sie auch nach BuildConfig.DEBUG, wenn Sie dann Crashlytics konfigurieren, z.

if (!BuildConfig.DEBUG) {
   Crashlytics.setUserIdentifier("HASH_ID");
}
Paul Spiesberger
quelle
2
Das scheint sauber zu sein. Anstatt in der primären Aktivität zu initialisieren, wenn nicht stattdessen in der Anwendungsinstanz?
Jules
Sie geben auf der Website an: Enable collection for selected users by initializing Crashlytics from one of your app's activitiesAber ich denke, es ändert sich nicht viel, wenn Sie Crashlytics in der Anwendung initialisieren. Hast Du es versucht? Wenn es funktioniert, kann ich es meiner Antwort hinzufügen. firebase.google.com/docs/crashlytics/customize-crash-reports
Paul Spiesberger
2
Ich konnte keine der anderen Lösungen zum Laufen bringen, um Crashlytics zur Laufzeit zu deaktivieren. Lösung 1 hat einfach perfekt funktioniert - warum habe ich nicht daran gedacht?
Danke für die Lösung. Wenn ich firebase_crashlytics_collection_enabledim Manifest auf false gesetzt habe , wird der Absturz nicht auf der Konsole angezeigt (ich verwende Version 2.9.9). Also habe ich dies behoben, indem ich ein separates Manifest für den Debug-Build mit firebase_crashlytics_collection_enabled=falseund truefür die Veröffentlichung
hinzugefügt habe
30

Wenn Sie Gradle verwenden, fügen Sie dies einfach einem Geschmack hinzu:

ext.enableCrashlytics = false
user1998494
quelle
1
das ist nur für den Geschmack? Was ist mit Debug vs. Release? Ich habe versucht, für das Debuggen zu deaktivieren, aber immer noch den Absturz senden
Xialin
Ich denke, es funktioniert nur bei Aromen. IMO mit der Flagge Austyn und Marcc zeigte am einfachsten.
user1998494
Ich habe die Lösung herausgefunden. aber nicht sicher, ob es für alte Crashlytics kompatibel ist. Es ist für das neue Crashlytics in Fabric SDK. Überprüfen Sie meine Antwort unten
Xialin
1
Dieser Befehl deaktiviert das Senden der Crashlytics-Zuordnungsdatei und das Generieren einer ID für jeden Build, wodurch Gradle-Builds dieser Varianten beschleunigt werden. (Crashlytics wird zur Laufzeit nicht deaktiviert.) Siehe die Antwort von Mike B hier: stackoverflow.com/questions/28339323/…
Aphex
18
Dies verursachte einen Absturz ... " This app relies on Crashlytics."
Sakiboy
27

Schauen Sie sich das neueste Dokument an. https://docs.fabric.io/android/crashlytics/build-tools.html#gradle-advanced-setup .

Abgesehen vom Hinzufügen ext.enableCrashlytics = falsevon build.grade müssen Sie Folgendes tun:

Crashlytics crashlyticsKit = new Crashlytics.Builder()
    .core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build())
    .build();

// Initialize Fabric with the debug-disabled crashlytics.
Fabric.with(this, crashlyticsKit);
Abhishek Patidar
quelle
Ich habe es auf diese Weise versucht und immer noch stürzt die App mitThis app relies on Crashlytics. Please sign up for access at
Balflear
Ich denke, Sie fehlen ext.enableCrashlytics = falsein build.gradle.
Abhishek Patidar
Nein, ich habe den Debug-Build-Typ in der Datei build.gradle hinzugefügt. Er befindet sich im Apply- buildTypes -> debug, also i'm applying the plugin via Plugin: 'io.fabric'`
Balflear
Ich bin mir nicht sicher, warum diese Lösung überhaupt 24-mal positiv bewertet wurde. Abstürze mitThis app relies on Crashlytics. Please sign up for access at https://fabric.io/sign_up
TROD
24

Ich fand dies die die einfachste Lösung sein:

    release {
        ...
        buildConfigField 'Boolean', 'enableCrashlytics', 'true'
    }
    debug {
        buildConfigField 'Boolean', 'enableCrashlytics', 'false'
    }

In den obigen Zeilen wird ein statisches boolesches Feld erstellt, das enableCrashlyticsin der BuildConfigDatei aufgerufen wird und anhand dessen Sie entscheiden können, ob Sie initiieren möchten Fabricoder nicht:

    if (BuildConfig.enableCrashlytics)
        Fabric.with(this, new Crashlytics());

HINWEIS: Bei dieser Methode wird Fabrics nur in Release-Builds initialisiert (wie im obigen Code angegeben). Dies bedeutet, dass Sie statische Methoden in der CrashlyticsKlasse in einem ifBlock aufrufen müssen, der prüft, ob Fabrics wie unten gezeigt initialisiert wurde.

if (Fabric.isInitialized())
    Crashlytics.logException(e);

Andernfalls stürzt die App Must Initialize Fabric before using singleton()beim Testen auf dem Emulator mit einem Fehler ab.

fahmy
quelle
17

2019 Antwort

Ich habe versucht, Crashlytics nur in der Version zu aktivieren und im Debug für 2 Stunden zu deaktivieren. Dabei habe ich in der Firebase-Konsole überprüft, ob die Ausnahmen hochgeladen wurden oder nicht.

Es gibt zwei Möglichkeiten, dies zu tun.

OPTION 1

Es funktioniert, aber wenn Sie Crashlyticsbeim Debuggen eine Methode aufrufen, stürzt die App ab .

app / build.gradle

android {
    buildTypes {
        release {
            manifestPlaceholders = [crashlyticsEnabled: true]
        }
        debug {
            manifestPlaceholders = [crashlyticsEnabled: false]
        }

AndroidManifest.xml

<manifest
    <application
        <meta-data
            android:name="firebase_crashlytics_collection_enabled"
            android:value="${crashlyticsEnabled}" />

OPTION 2

Eine Alternative, wenn Sie damit CrashlyticsMethoden aufrufen können, ohne BuildConfig.DEBUGvorher zu prüfen . Mit diesem Setup können Sie sicher Methoden aufrufen wie Crashlytics.logException()- sie tun einfach nichts in Debug-Builds. Ich sehe nicht, dass die Berichte beim Debuggen hochgeladen werden.

app / build.gradle

android {
    buildTypes {
        release {
            ext.enableCrashlytics = true
        }
        release {
            ext.enableCrashlytics = false
        }

AndroidManifest.xml

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

Anwendung onCreate ()

val crashlytics = Crashlytics.Builder()
    .core(CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build())
    .build()
Fabric.with(this, crashlytics)
Albert Vila Calvo
quelle
Ich denke android:value="false"muss geändert werden android:value="${enableCrashlytics}". Ist es nicht?
JaydeepW
Ein weiterer Vorteil von Option 2 besteht darin, dass Sie mit der zunächst deaktivierten Analyseerfassung beginnen und dann den Benutzer zunächst fragen können, ob es in Ordnung ist, die Nutzung der App zu verfolgen (denken Sie an GDPR). Dann würden Sie den Fabric.with-Aufruf nur ausführen, wenn der Benutzer der Verfolgung zugestimmt hat.
Per Christian Henden
Der einzige Nachteil von Option 2 ist, dass weiterhin Debug-Versionen im Firebase-Dashboard erstellt werden, obwohl dort keine Abstürze angezeigt werden (da diese deaktiviert sind). Dies führt zu zwei Problemen: Erstens ist es schwieriger, Release-Versionen zu finden. Zweitens: Das Firebase-Dashboard zeigt nur die letzten 100 Versionen an. Dies kann dazu führen, dass in einigen alten Versionen keine Abstürze auftreten. Im Fabric-Dashboard können Sie eine bestimmte Version deaktivieren. Dies ist im Firebase-Dashboard nicht möglich .
Alex Lipov
14

Verwenden Sie dies in MyApplication#onCreate()

if (!BuildConfig.DEBUG) Crashlytics.start(this);

BEARBEITEN Wenn Sie ein Upgrade auf Fabric durchgeführt haben, verwenden Sie stattdessen diese Antwort .

Austyn Mahoney
quelle
BuildConfig.DEBUG ist nicht immer richtig eingestellt. Das Aktivieren / Deaktivieren von Crashlytics hat mir bei der Verwendung von IntelliJ einige Probleme bereitet.
Zeb Barnett
5
Welche Build-Tools verwenden Sie? Gradle wird diesen Wert IMMER einstellen. Es war vor einem Jahr ein Problem, aber die neuen Build-Tools sind viel besser.
Austyn Mahoney
Ich bin auf v0.9. + Des Gradle-Plugins für IntelliJ und v1.11 für Gradle selbst.
Zeb Barnett
Ich habe in keiner meiner Apps Probleme festgestellt. BuildConfigwird von einer Gradle-Aufgabe generiert, die garantiert ausgeführt wird. Ich verwende auch buildConfigField, um benutzerdefinierte Felder festzulegen, und diese funktionieren immer. tools.android.com/recent/androidstudio045released schlägt ebenfalls vor, dass Sie verwenden BuildConfig.DEBUG.
Austyn Mahoney
Als Idealist würde ich es gerne nutzen können, da dies den nicht ganz automatisierten Erstellungsprozess für das kleine Unternehmen, für das ich arbeite, vereinfachen würde. Es ist nur so, dass wir einen Build in Produktion gebracht haben, der von dieser Flagge abhängt, und Crashlytics hat nie gesehen, dass er live geht. Nachdem wir es wieder manuell umgeschaltet hatten, sah Crashlytics es sofort.
Zeb Barnett
9

Eine weitere einfache Lösung, die mir gefällt, da keine anderen Manifestdateien erforderlich sind:

Schritt 1 - Definieren Sie manifestierte Platzhalter in build.gradle

android {
    ...
    buildTypes {
        release {
            manifestPlaceholders = [crashlytics:"true"]
        }
        debug {
            manifestPlaceholders = [crashlytics:"false"]
        }
    }
    ...
}

Schritt 2 - Verwenden Sie sie in Ihrer AndroidManifest.xml

<meta-data
        android:name="firebase_crashlytics_collection_enabled"
        android:value="${crashlytics}" />
arbuz
quelle
6

Beachten Sie, dass Sie auch das lästige Hochladen von Symbolen im Debug-Build deaktivieren können:

def crashlyticsUploadStoredDeobsDebug = "crashlyticsUploadStoredDeobsDebug"
def crashlyticsUploadDeobsDebug = "crashlyticsUploadDeobsDebug"
tasks.whenTaskAdded { task ->
    if (crashlyticsUploadStoredDeobsDebug.equals(task.name) ||
            crashlyticsUploadDeobsDebug.equals(task.name)) {

        println "Disabling $task.name."
        task.enabled = false
    }
}

Legen Sie es einfach in das build.gradleAnwendungsmodul ein.

Ariel Cabib
quelle
6

Wenn Sie alle Abstürze erfassen möchten (für Debug- und Release-Builds), diese jedoch im Crashlytics-Dashboard trennen möchten, können Sie build.gradle diese Codezeile hinzufügen:

debug {
    versionNameSuffix "-DEBUG"
}

Wenn der Versionsname Ihrer App beispielsweise 1.0.0 lautet, werden Ihre Release-Builds mit 1.0.0 gekennzeichnet, während die Debug-Builds 1.0.0-DEBUG lauten

Khronos
quelle
Das ist es? Keine Notwendigkeit, Aromen zu tun?
Portfoliobuilder
6

Hier gibt es viele gute Antworten, aber für meine Tests verwende ich Debug-Builds für interne Betas und Tests außerhalb des Labors, bei denen Absturzprotokolle immer noch sehr nützlich sind und ich sie weiterhin melden möchte. Wie beim OP wollte ich sie nur während der aktiven Entwicklung deaktivieren, wo ich häufig Abstürze verursache und schnell behebe.

Anstatt ALLE Debug-Abstürze zu entfernen, können Sie die Berichte nur deaktivieren, während ein Gerät mit dem folgenden Code mit Ihrem Entwicklungscomputer verbunden ist.

if (!Debug.isDebuggerConnected()) {
    Fabric.with(this, new Crashlytics());
}
William Henderson
quelle
Es ist falsch. Ich protokolliere nicht schwerwiegende Ausnahmen in meinem Code mit Crashlytics.logException(e)und diese Anweisung löst eine Ausnahme in Debug-Builds aus, da Fabric-Singleton nicht initialisiert ist. Wenn Sie Crashlytics verwenden, initialisieren Sie immer Fabric-Singleton. Siehe Fahmys Antwort .
NaXa
5

Das Problem ist, dass keine der Lösungen für das neueste Crashlytics SDK funktioniert. (Ich benutze 2.9.0)

Sie können es nicht per Code deaktivieren, da es in Ihr Projekt kompiliert und bereits vor einem Aufruf von onCreate Ihrer Anwendung ausgeführt wird. Eine andere Lösung ist also einfach: Kompilieren Sie keine Crashlytics, wenn sie nicht benötigt werden. Ersetzen Sie den Aufruf 'compile' durch 'releaseCompile' in der Datei build.gradle.

 releaseCompile('com.crashlytics.sdk.android:crashlytics:2.9.0@aar') {
        transitive = true
    }
Kvant
quelle
3

Aktuelle einfachste Version bei Verwendung von Gradle zum Erstellen:

if (!BuildConfig.DEBUG) {
    Fabric.with(this, new Crashlytics());
}

Es verwendet die neue integrierte Syntax von Fabric for Crashlytics und arbeitet automatisch mit einem Gradle-Build.

Björn Kechel
quelle
3

Ein seltsames Problem, auf das ich gestoßen bin: Ich habe die Antwort von Xialin (die auch auf der offiziellen Website erscheint) befolgt und es hat nicht funktioniert. Es stellte sich heraus, dass ich BuildConfigin Fabric's Paket referenziert habe, das auch eine statische DEBUG-Variable enthält, die selbst im Debug-Modus auf false gesetzt wurde.

Wenn Sie also der oben genannten Lösung folgen und dennoch Debug-Berichte erhalten, stellen Sie sicher, dass Sie auf Folgendes verweisen:

import com.yourpackagename.BuildConfig;

Und nicht das:

import io.fabric.sdk.android.BuildConfig;    
Neria Nachum
quelle
2

Wenn Sie befürchten, BuildConfig.DEBUGnicht richtig eingerichtet zu sein, verwenden Sie ApplicationInfostattdessen:

boolean isDebug = ( mAppContext.getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE ) != 0;
Crashlytics crashlytics = new Crashlytics.Builder().disabled( isDebug ).build();
Fabric.with( uIContext, crashlytics );
Vaiden
quelle
2

Verwenden Sie Aromen oder bauen Sie Konfigurationen. Verwenden Sie eine separate Build-ID für den Dev-Build, und alle Ihre Abstürze werden weiterhin in einer separaten App angezeigt. Kann nützlich sein, wenn Sie den Build für Peers freigeben oder ohne Debugger verwenden. Etwas wie das -

    productFlavors {
    dev {
        applicationId "io.yourapp.developement"
    }
    staging {
        applicationId "io.yourapp.staging"
    }

    production {
        applicationId "io.yourapp.app"
    }
Ribhu
quelle
2

Wenn Sie einen debuggbaren Release-Build wünschen, gehen Sie wie folgt vor:

buildTypes {
    release {
        signingConfig signingConfigs.config
        debuggable true //-> debuggable release build
        minifyEnabled true
        multiDexEnabled false
        ext.enableCrashlytics = true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        buildConfigField 'boolean', 'BUILD_TYPE_DEBUG', 'false'
    }
    debug {
        minifyEnabled false
        multiDexEnabled true
        ext.enableCrashlytics = false
        ext.alwaysUpdateBuildId = false
        // Disable fabric build ID generation for debug builds
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        buildConfigField 'boolean', 'BUILD_TYPE_DEBUG', 'true'
    }
}

Wenn Sie festlegen debuggable true, dass BuildConfig.DEBUG mit true initialisiert wird, habe ich diese Variable in der BuildConfig-Klasse hinzugefügt.

Init Fabric:

Crashlytics crashlytics = new Crashlytics.Builder()
            // disable crash reporting in debug build types with custom build type variable
            .core(new CrashlyticsCore.Builder().disabled(BuildConfig.BUILD_TYPE_DEBUG).build())
            .build();

    final Fabric fabric = new Fabric.Builder(this)
            .kits(crashlytics)
            //enable debugging with debuggable flag in build type 
            .debuggable(BuildConfig.DEBUG)
            .build();

    // Initialize Fabric with the debug-disabled crashlytics.
    Fabric.with(fabric);
M. Reza Nasirloo
quelle
Was ist der Zweck von ext.enableCrashlyticsund ext.alwaysUpdateBuildIdda sie nirgendwo referenziert zu sein scheinen. Vermisse ich etwas
Jules
@jules Es ist in den Dokumenten docs.fabric.io/android/crashlytics/build-tools.html
M. Reza Nasirloo
BuildConfig.BUILD_TYPE_DEBUG ist redundant, BuildConfig.DEBUG kann verwendet werden, um den gleichen Wert zu erhalten
Antonis Radz
@AntonisRadz Weil ich einen debuggbaren Release Build brauchte
M. Reza Nasirloo
1

Wir können die isDebuggable () -Methode von Fabric verwenden.

import static io.fabric.sdk.android.Fabric.isDebuggable;

if(! isDebuggable()){
    // set Crashlytics ... 
}

Viel Spaß beim Codieren :)

sadiq
quelle
1

Sie können eine dedizierte Manifestdatei für den Debug-Modus verwenden (funktioniert bei mir mit Crashlytics 2.9.7):

Erstellen Sie die Datei app/src/debug/AndroidManifest.xmlund fügen Sie Folgendes hinzu:

<application>

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

</application>

Beachten Sie, dass dieses Metadatenelement nur in debug / AndroidManifest.xml und nicht in die reguläre AndroidManifest.xml eingefügt werden darf

Die verwendete Lösung CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()hat bei mir nicht funktioniert, und ich habe festgestellt, dass Crashlytics vom CrashlyticsInitProvider initialisiert wird, bevor Application.onCreate () aufgerufen oder eine Aktivität gestartet wird. Dies bedeutet, dass die manuelle Initialisierung von Fabric in der Anwendung oder einer Aktivität keine hat Effekt, da der Stoff bereits initialisiert ist.

Josias
quelle
1

Schritt 1: In build.grade

buildTypes {
        debug {
            debuggable true
            manifestPlaceholders = [enableCrashlytic:false]
        }
        release {
            debuggable false
            manifestPlaceholders = [enableCrashlytic:true]
        }
    }

Schritt 2: Im Manifest

<meta-data
            android:name="firebase_crashlytics_collection_enabled"
            android:value="${enableCrashlytic}" />

Schritt 3: In der Anwendung oder in der ersten Aktivität

private void setupCrashReport() {
        if (BuildConfig.DEBUG) return;
        Fabric.with(this, new Crashlytics());
    }

Ich bin nicht sicher, ob Schritt 3 notwendig ist, aber um sicherzustellen, dass die Release-Version ohne Absturz funktioniert. Quelle: https://firebase.google.com/docs/crashlytics/customize-crash-reports#enable_opt-in_reporting

thanhbinh84
quelle
1

Diese Arbeit für mich:

    releaseCompile  'com.crashlytics.sdk.android:crashlytics:2.9.9'

und in buildTypes:

debug {
ext.enableCrashlytics = false
}
Amirhosein Heydari
quelle
Wie wäre es mit der Verwendung von Crashlytics im Code? Es gibt Ihnen Kompilierungsfehler.
Micer
1

Es gibt zwei Optionen, um Firebase Crashlytics für die folgende Version zu deaktivieren: com.google.firebase: firebase-crashlytics: 17.0.0:

  1. Fügen Sie dem Manifest der App ein Meta-Tag hinzu

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

ODER

  1. Direkt in der App konfigurieren (denken Sie daran, wenn der Wert auf false gesetzt ist, gilt der neue Wert erst beim nächsten Ausführen der App.)

FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true)

Viktor Ivanov
quelle
0

Eine andere Möglichkeit, wenn Sie dies nur in Ihrer IDE tun möchten, besteht darin, sich vom Plugin abzumelden. Anscheinend werden keine Berichte mehr gesendet, während Sie Builds generieren, ohne sich erneut anzumelden.

neteinstein
quelle
0
  1. Fügen Sie dies dem build.gradle Ihrer App hinzu:

    android {
        buildTypes {
            debug {
              // Disable fabric build ID generation for debug builds
              ext.enableCrashlytics = false
              ...
  2. Deaktivieren Sie das Crashlytics-Kit zur Laufzeit. Andernfalls wird das Crashlytics-Kit den Fehler auslösen:

    // Set up Crashlytics, disabled for debug builds
    // Add These lines in your app Application class onCreate method
    
    Crashlytics crashlyticsKit = new Crashlytics.Builder()
        .core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build())
        .build();
    
    // Initialize Fabric with the debug-disabled crashlytics.
    Fabric.with(this, crashlyticsKit);
  3. Fügen Sie in AndroidManifest.xml hinzu

    <meta-data
    android:name="firebase_crashlytics_collection_enabled"
    android:value="false" />
100rbh
quelle
0

2020 Post Fabric Antwort

Fügen Sie den folgenden Code in Ihre Anwendungsklasse ein und rufen Sie die Methode setCrashlyticsStateaus Ihrer Anwendung onCreate auf. Optional können Sie die IDs Ihres Testgeräts zum hinzufügendebugDevices IDs HashSet hinzufügen, damit Ihre persönlichen Geräte ignoriert werden können, selbst wenn Sie im Release-Modus erstellen.

Hinweis. Es Settings.Secure.getString(getContext().getContentResolver(), Settings.Secure.ANDROID_ID);wird nicht garantiert , dass die von zurückgegebene Geräte-ID eindeutig oder konstant ist (sie kann sich beim Zurücksetzen auf die Werkseinstellungen oder manuell bei einem gerooteten Gerät ändern). Aber es sollte gut genug sein.

private final HashSet<String> debugDevices = new HashSet<String>(Arrays.asList("6a3d5c2bae3fd32c"));

private boolean isDebugDevice(String deviceId) {
    return debugDevices.contains(deviceId);
}

private void setCrashlyticsState() {
    @SuppressLint("HardwareIds")
    String deviceId = Settings.Secure.getString(getContext().getContentResolver(), Settings.Secure.ANDROID_ID);
    if (BuildConfig.DEBUG || isDebugDevice(deviceId)) {
        Log.v("DeviceId", deviceId);
        FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(false);
    }
}

Überprüfen Sie die BuildConfig. sucht nach der richtigen BuildConfig-Klasse. Es gibt oft mehrere Optionen und die falsche könnte hineingezogen werden.

Will Calderwood
quelle
-8

Das ist eine dumme Antwort, ich weiß.
Kommentiere es einfach aus Fabric.with(this, new Crashlytics());, arbeite daran und kommentiere es aus , wenn du es veröffentlichen willst.

Tej42
quelle