Отчет о сбоях Firebase: FirebaseApp с именем [ПО УМОЛЧАНИЮ] не существует

Это исключение, с которым я столкнулся при попытке использовать FirebaseAuth и отчеты о сбоях Firebase. Я пытаюсь анонимно войти в свое приложение onCreate

public class MainApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
        firebaseAuth.signInAnonymously().addOnCompleteListener(task -> {
            if (task.isSuccessful()) {
                Log.wtf("TAG", "Signed signInAnonymously successful ");
            }
        });
    }
}

Я также хочу использовать отчеты о сбоях, чтобы мои зависимости Gradle выглядели так.

dependencies {
    // other dependencies
    // ...

    compile 'com.google.firebase:firebase-core:9.2.1'
    compile 'com.google.firebase:firebase-storage:9.2.1'
    compile 'com.google.firebase:firebase-auth:9.2.1'
    compile 'com.google.firebase:firebase-config:9.2.1'
    compile 'com.google.firebase:firebase-crash:9.2.1'
}

apply plugin: 'com.google.gms.google-services'

Через определенное время я получу диалоговое окно сбоя и это исключение. Это еще один процесс, который дает сбой, поэтому само приложение все еще работает.

java.lang.RuntimeException: Unable to create application com.android.tools.fd.runtime.BootstrapApplication: java.lang.IllegalStateException: FirebaseApp with name [DEFAULT] doesn't exist. 
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4612)
    at android.app.ActivityThread.access$1600(ActivityThread.java:169)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1337)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5476)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
    at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.IllegalStateException: FirebaseApp with name [DEFAULT] doesn't exist. 
    at com.google.firebase.FirebaseApp.getInstance(Unknown Source)
    at com.google.firebase.FirebaseApp.getInstance(Unknown Source)
    at com.google.firebase.auth.FirebaseAuth.getInstance(Unknown Source)
    at com.redstar.collectors.MainApplication.onCreate(MainApplication.java:22)
    at com.android.tools.fd.runtime.BootstrapApplication.onCreate(BootstrapApplication.java:369)
    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1013)
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4609)
    at android.app.ActivityThread.access$1600(ActivityThread.java:169) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1337) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.app.ActivityThread.main(ActivityThread.java:5476) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084) 
    at dalvik.system.NativeStart.main(Native Method)

Если я уберу зависимость от firebase-crash, сбоя не будет.


person Eoin    schedule 14.07.2016    source источник
comment
Это состояние гонки между вашим кодом инициализации и некоторым кодом автоинициализации в Firebase. Вы захотите переместить инициализацию в свою основную активность (где она запускается позже) или, что предпочтительнее, в поставщика контента (где она запускается раньше).   -  person Frank van Puffelen    schedule 14.07.2016


Ответы (1)


FirebaseApp with name [DEFAULT] doesn't exist возникает, когда вы запускаете код Firebase в отдельном процессе, созданном Firebase Crash Reporting, поскольку ваш собственный класс Application создается для каждого процесса в вашем приложении.

Вы должны переместить код из своего класса Application в другое место. Это может быть в вашей основной деятельности (которая всегда будет в вашем основном процессе) или может быть в onCreate() отдельного ContentProvider, который вы регистрируете в своем манифесте (ContentProvider onCreate() запускается один раз в жизненном цикле вашего процесса приложения точно так же, как Application.onCreate(), но работает только в одном процессе).

person ianhanniballake    schedule 14.07.2016
comment
Спасибо за ответ. Проблема, с которой я столкнулся при размещении кода в моей основной деятельности, заключается в том, что моя основная деятельность не гарантированно будет запускаться каждый раз. Например, я не открою свою основную активность, если запущу ее из общего намерения. Таким образом, у меня мог бы быть дублированный код или базовая активность, и то, и другое я бы предпочел не делать. Контент-провайдер кажется странным, поскольку я на самом деле не собираюсь предоставлять какой-либо контент. Может быть, инъекция - это выход? - person Eoin; 14.07.2016
comment
Да, полностью согласен со странным ощущением подхода ContentProvider. Вы определенно можете иметь код как статический метод в классе и вызывать его из каждого компонента, где вам нужно убедиться, что он готов - статическое логическое значение, если вы уже выполнили настройку, гарантирует, что это делается только один раз за инициализация процесса. - person ianhanniballake; 14.07.2016
comment
Хорошо, может быть, это лучший способ сделать это. Спасибо. С другой стороны, действительно ли необходимо запускать отчеты о сбоях Firebase в отдельном процессе? - person Eoin; 14.07.2016
comment
@Modge - это требование текущей версии, хотя я, кажется, видел на форуме Firebase, что они надеются убрать это требование. - person ianhanniballake; 14.07.2016