peshkira
peshkira

Reputation: 6239

Fabric's Crashlytics with Firebase can't be disabled for DEBUG builds

I have an app that utilises Fabric's Crashlytics via Firebase. The following is the first thing executed in my Applications onCreate

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

Nonetheless, the crashes are submitted in DEBUG == true mode.

I use the following versions

in my build.gradle classpath "io.fabric.tools:gradle:1.25.1"

in my app/build.gradle implementation "com.crashlytics.sdk.android:crashlytics:2.9.1"

Unfortunately the crashes still get reported. Any ideas, what I am doing wrong?

Upvotes: 44

Views: 24699

Answers (7)

Quentin G.
Quentin G.

Reputation: 1003

I think it is possible to do it from code as well if you switched to firebase crashlytics and removed fabric crashlytics : link to firebase doc

So in the onCreate of your application class :

FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(!BuildConfig.DEBUG);

Upvotes: 5

Phileo99
Phileo99

Reputation: 5659

If you would like to completely disable Firebase Crash reporting AND also not have to add the

com.crashlytics.sdk.android:crashlytics:2.9.1

dependency, then follow @reVerse's answer but also add this to your AndroidManifest.xml:

<application ...>

    // ...

    <meta-data 
            android:name="firebase_crashlytics_collection_enabled" 
            android:value="${enableCrashReporting}" />
    <meta-data
            android:name="firebase_analytics_collection_deactivated"
            android:value="true"/>
</application>

Upvotes: 1

K Pradeep Kumar Reddy
K Pradeep Kumar Reddy

Reputation: 650

Got this information from android documentation Customize your Firebase Crash Reports

Enable opt-in reporting: By default, Firebase Crashlytics automatically collects crash reports for all your app's users. To give users more control over the data they send, you can enable opt-in reporting instead.

To do that, you have to disable automatic collection and initialize Crashlytics only for opt-in users.

Turn off automatic collection with a meta-data tag in your AndroidManifest.xml file:

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

Enable collection for selected users by initializing Crashlytics from one of your app's activities:

Fabric.with(this, new Crashlytics());

Upvotes: 3

reVerse
reVerse

Reputation: 35264

Correct answers have been posted by Bob Snyder and niqueco already however it seems kinda tedious to change the meta-data value every time you are building an actual release APK thus here's a solution that uses so called manifestPlaceholder and changes the value automatically to trueor false depending on the buildType.

Add the following to your apps build.gradle

android {

    // ...

    buildTypes {
        debug {
            manifestPlaceholders = [enableCrashReporting:"false"]
        }
        release {
            manifestPlaceholders = [enableCrashReporting:"true"]
        }
    }

}

And this to your AndroidManifest.xml

<manifest ... >

    <application ...>

        // ...

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

    </application>

</manifest>

You can verify the current value by clicking on the Merged Manifest tab once you have opened the AndroidManifest.xml. You should see something like this:

Merged manifest meta-data value for crash reporting

Upvotes: 133

Bob Snyder
Bob Snyder

Reputation: 38319

The Firebase Crashlytics documentation explains that once reporting is enabled in an app session, it cannot be disabled.

By default, Crashlytics reporting is enabled in a ContentProvider named CrashlyticsInitProvider that executes before your Application instance is created. CrashlyticsInitProvider enables or disables reporting based on the meta-data value firebase_crashlytics_collection_enabled, which by default is true.

If you want reporting disabled, it's critical that the manifest meta-data be present and set to false:

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

Look in the logcat during app initialization for the message:

CrashlyticsInitProvider: CrashlyticsInitProvider initialization successful

If the message is present, firebase_crashlytics_collection_enabled is true. If the message is not present, you have successfully set the meta-data to disable crash reporting.

If the meta-data is missing or set to true, you cannot disable reporting in your code using a call to Fabric.with(...).

In a comment to another answer, you indicate that you tried disabling reporting using the meta-data and were not successful. Check for a typo and ensure the declaration is correctly placed in the <application> element. In my tests, I am able to disabling reporting using the meta-data and then enable at run time.

Upvotes: 44

niqueco
niqueco

Reputation: 2408

I've finally found the issue. Crashlytics is initialized from a content provider, so by the time you try to disable from Application's onCreate() it's too late. Going through the decompiled code I've seen that you can disable that initialization by adding metadata to the <application> element in the manifest.

So, what I do is this... I've added this to app/src/debug/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?><!--suppress ALL -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="<your app package>">

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

</manifest>

I've also disabled Crashlytics in the app module gradle build file by adding:

    debug {
        ext.enableCrashlytics = false
    }

To my surprise I didn't need to do the Fabric.with(...) thing. The above was enough.

It's working fine: no reports.

Upvotes: 9

vm345
vm345

Reputation: 813

You need to disable Crashlytics of app’s build.gradle. Disable Crashlytics for Debug Builds

android {
    buildTypes {
        debug {
          // Disable fabric build ID generation for debug builds
          ext.enableCrashlytics = false
          ...  

Upvotes: 2

Related Questions