Why is Fabric not initialized? java.lang.IllegalStateException: Must Initialize Fabric before using singleton()

15,231

Solution 1

You need to initialize Crashlytics in your application's onCreate

import android.app.Application;

import com.crashlytics.android.Crashlytics;

import io.fabric.sdk.android.Fabric;

public class TestApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        Fabric.with(this, new Crashlytics());
    }
}

Solution 2

In my case, The below checks helped to get rid of the error.

If you find code like below in your manifest, set it to true or remove it since it's true by default.

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

Also incase if the value is being pulled in from your build.gradle, check which buildType its in and consider not invoking any Crashlytics functions under that buildType.

Example: build.gradle

android{

    ...

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

In this case you should have your Crashlytics calls wrapped like this -

if(!BuildConfig.DEBUG){
   ...
   Crashlytics.setUserIdentifier(...)
   ...
}

Solution 3

If you migrated from Fabric.io to Firebase, there must be some lines you need to DELETE from AndroidManifest.xml

        <!-- Fabric.io Analytics key -->
        <meta-data
            android:name="io.fabric.ApiKey"
            android:value="49yy995568140ee22uio128e00450bd99603fd43" />

With those lines, the Crashlytics plugin can NOT be initialized correctly by Firebase.

Solution 4

When you are using Firebase Crashlytics, you don't need to do any Fabric initialization. Everything is done automatically.

But if you want to do any custom logging, via (for example) Crashlytics.log("Custom log"), you need to have FirebaseCrashlytics enabled in your manifest. Check the manifest if you have something like that:

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

${crashlyticsEnabled} can be set to true or false or via you app level build.gradle. This is typically used to disable Firebase Crashlytics when you are debugging the app.

Solution 5

If you used android:process, then automatic initialization wouldn't work because it works by using a content provider in your manifest. In that case, you'll have to manually initialize Crashlytics.

Share:
15,231
John Threepwood
Author by

John Threepwood

Primary interests: Logic, Java/C#, C/C++. If you wish to get in contact, please email me: firstname.lastname at GMAIL

Updated on June 17, 2022

Comments

  • John Threepwood
    John Threepwood about 2 years

    I set up Firebase Crashlytics according to Get started with Firebase Crashlytics for my Android app (using Android studio 3.1.3). On my own device as well as on the Emulator, everything works fine and my crashes appear correctly within the Firebase Console. So far so good.

    However, there was a crash for one of my app users that was unexpected:

    java.lang.IllegalStateException: Must Initialize Fabric before using singleton()

    The exception was thrown in another Activity than the MainActivity.

    I am aware that you could manually execute the initialization as described here by calling Fabric.with(this, new Crashlytics()); However, there is nothing said about one has to manually initialize the Crashlytics in the Getting Started article mentioned above. I was expecting this is done automatically since all my own tests run fine. So why is it that for some users Crashlytics is set up correctly and for some not?

  • John Threepwood
    John Threepwood about 6 years
    Thank you for your answer. As I described, I know I can just to what you propose. However, I thought it would be set up automatically since on my own device everything runs fine. Also, the official documentation does not say anything about this. I just wanted to know why manual setup is required for some devices and for some not?
  • Gil Goldzweig
    Gil Goldzweig about 6 years
    I'm almost positive that it does require on all devices maybe you received an exception on one device which called fabric and on other device it didn't throw an exception there for fabric is never called
  • John Threepwood
    John Threepwood about 6 years
    Thanks for your quick reply. Hm... This makes me thinking. Because on my own device the test example on the Getting Started documentation where one crashes the app on purpose via button works fine. I can see the crash report on Crashlytics without ever initializing anything manually. So on my own device it has been initialized somehow.
  • Mickäel A.
    Mickäel A. almost 6 years
    Beware that if you set this value to false and call Crashlytics.log() you'll get exactly the same error the OP has. To avoid this, you have to initiate Crashlytics manually in code and disable its reporting feature conditionally. See this SO answer.
  • Kirill Karmazin
    Kirill Karmazin over 5 years
    This one worked for me! Whereas approach with 'auto-initializing as docs say and <meta-data.../> in Manifest - Failed)
  • Manikandan
    Manikandan almost 4 years
    Yes, root cause is using "com.crashlytics.sdk.android:crashlytics" Fabric NDK dependency instead of Firebase NDK (com.google.firebase:firebase-crashlytics-ndk). App works fine after I started using com.google.firebase:firebase-crashlytics-ndk.
  • sejn
    sejn almost 4 years
    I have deleted the above but still facing the above issue after firebase migration
  • sejn
    sejn almost 4 years
    @GilGoldzweig If I migrate to firebase shall I need to initialize the above in my application. According to the doc of firebase, i not need to add the above for initialzation