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が正しくセットアップされているのか、そうでないのか?
アプリケーションの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());
}
}
私の場合、以下のチェックはエラーを取り除くのに役立ちました。
manifestで以下のようなコードを見つけた場合は、デフォルトでtrueになっているため、trueに設定するか削除します。
<meta-data
Android:name="firebase_crashlytics_collection_enabled"
Android:value="false" />
また、valueがbuild.gradleからプルされている場合、どのbuildTypeをチェックし、その下でCrashlytics関数を呼び出さないことを検討しますbuildType。
例:build.gradle
Android{
...
buildTypes {
debug{
manifestPlaceholders = [enableCrashReporting:"false"]
}
release {
manifestPlaceholders = [enableCrashReporting:"true"]
}
}
}
この場合、Crashlytics呼び出しを次のようにラップする必要があります-
if(!BuildConfig.DEBUG){
...
Crashlytics.setUserIdentifier(...)
...
}
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を無効にするために使用されます。
Android:process
を使用した場合、マニフェストでコンテンツプロバイダーを使用することで機能するため、自動初期化は機能しません。その場合、 手動でCrashlyticsを初期化 する必要があります。