web-dev-qa-db-ja.com

ファブリックが初期化されないのはなぜですか? Java.lang.IllegalStateException:singleton()を使用する前にFabricを初期化する必要があります

Androidアプリ用に Firebase Crashlyticsの開始 に従ってFirebase Crashlyticsを設定します(Android studio 3.1.3を使用)。エミュレータだけでなく自分のデバイスでも、すべてが正常に機能し、クラッシュがFirebase Console内に正しく表示されます。ここまでは順調ですね。

ただし、アプリユーザーの1人に予期しないクラッシュが発生しました。

Java.lang.IllegalStateException:singleton()を使用する前にFabricを初期化する必要があります

例外は、MainActivity以外のアクティビティでスローされました。

Fabric.with(this, new Crashlytics());を呼び出すことで here のように初期化を手動で実行できることは承知していますが、上記の「Getting Started」の記事でCrashlyticsを手動で初期化する必要があるとは言われていません。私のテストはすべて正常に実行されるため、これは自動的に行われると期待していました。それでは、なぜ一部のユーザーにとってCrashlyticsが正しくセットアップされているのか、そうでないのか?

29
John Threepwood

アプリケーションのonCreateでCrashlyticsを初期化する必要があります

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());
    }
}
22
Gil Goldzweig

私の場合、以下のチェックはエラーを取り除くのに役立ちました。

manifestで以下のようなコードを見つけた場合は、デフォルトでtrueになっているため、trueに設定するか削除します。

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

また、valuebuild.gradleからプルされている場合、どのbuildTypeをチェックし、その下でCrashlytics関数を呼び出さないことを検討しますbuildType

例:build.gradle

Android{

    ...

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

この場合、Crashlytics呼び出しを次のようにラップする必要があります-

if(!BuildConfig.DEBUG){
   ...
   Crashlytics.setUserIdentifier(...)
   ...
}
5
Jishin Dev

Firebase Crashlyticsを使用している場合、Fabricの初期化を行う必要はありません。すべてが自動的に行われます。

ただし、(たとえば)Crashlytics.log("Custom log")を介してカスタムロギングを実行する場合は、マニフェストでFirebaseCrashlyticsを有効にする必要があります。そのようなものがある場合は、マニフェストを確認してください。

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

${crashlyticsEnabled}は、trueまたはfalseに設定するか、アプリレベルbuild.gradleで設定できます。これは通常、アプリのデバッグ時にFirebase Crashlyticsを無効にするために使用されます。

2
hiddeneyes02

Android:processを使用した場合、マニフェストでコンテンツプロバイダーを使用することで機能するため、自動初期化は機能しません。その場合、 手動でCrashlyticsを初期化 する必要があります。

1
Mygod