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

南楼画角 提交于 2019-11-27 11:34:06

问题


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?


回答1:


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.




回答2:


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:




回答3:


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.




回答4:


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
          ...  



回答5:


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



回答6:


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>



来源:https://stackoverflow.com/questions/49528780/fabrics-crashlytics-with-firebase-cant-be-disabled-for-debug-builds

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!