Firebase Crash Reporting を正常に実装しましたが、開発中にコンソールで非現実的なクラッシュを回避するために、アプリの実行中にサービスを無効にして「デバッグ」ビルド バリアントを元に戻す必要があります。
公式ドキュメントはこれについて何も述べていません。
Firebase Crash Reporting を正常に実装しましたが、開発中にコンソールで非現実的なクラッシュを回避するために、アプリの実行中にサービスを無効にして「デバッグ」ビルド バリアントを元に戻す必要があります。
公式ドキュメントはこれについて何も述べていません。
更新: Google Play サービス / Firebase 11 以降では、実行時にクラッシュ レポートを無効にできるようになりました。FirebaseCrash.setCrashCollectionEnabled()
(ありがとう@Tyler Carberry )
古い答え:
コミュニティが推測できる限り、これに対する公式のサポートはありません。これを行う最善の方法は、ビルド タイプごとに 1 つずつ、ダッシュボードに複数の Firebase アプリをセットアップし、ビルド バリアントに応じてそれぞれの異なるアプリに向ける複数の google_services.json ファイルをセットアップすることです。
私の Application クラスでは、 onCreate()
if (BuildConfig.DEBUG) {
Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread paramThread, Throwable paramThrowable) {
Log.wtf("Alert", paramThrowable.getMessage(), paramThrowable);
System.exit(2); //Prevents the service/app from freezing
}
});
}
Firebaseのものを含むoldHandlerを使用するため、機能します
final UncaughtExceptionHandler oldHandler = Thread.getDefaultUncaughtExceptionHandler();
処理経路外
この関連する回答やその他の回答に触発されて、この便利なソリューションを思いつきました。
ロギングにTimberを使用して、デバッグ ビルドとリリース ビルド用に Tree サブクラスのさまざまな実装を作成しました。デバッグでは、logcat に書き込む DebugTree に従います。リリースでは、例外と優先度の高いログを Firebase に転送し、残りをドロップします。
build.gradle
dependencies {
...
compile 'com.jakewharton.timber:timber:4.3.0'
releaseCompile 'com.google.firebase:firebase-crash:9.0.2'
}
src/debug/java/[パッケージ]/ForestFire.java
import timber.log.Timber;
public class ForestFire extends Timber.DebugTree {}
src/release/java/[パッケージ]/ForestFire.java
import android.util.Log;
import com.google.firebase.crash.FirebaseCrash;
import timber.log.Timber;
public class ForestFire extends Timber.Tree {
@Override
protected void log(int priority, String tag, String message, Throwable t) {
if (Log.WARN <= priority) {
FirebaseCrash.log(message);
if (t != null) {
FirebaseCrash.report(t);
}
}
}
}
アプリの起動
Timber.plant(new ForestFire());
最初に gradle ファイルの変数を初期化し、デバッグ モードかリリース モードかを確認します。クラッシュ レポートを送信する最善の方法は、Application クラス内で行うことです。
Build.gradle
buildTypes {
release {
buildConfigField "Boolean", "REPORT_CRASH", '"true"'
debuggable false
}
debug {
buildConfigField "Boolean", "REPORT_CRASH", '"false"'
debuggable true
}
}
最初にモードを確認し、クラッシュした場合はクラッシュ レポートを送信します。
アプリケーション.java
/** Report FirebaseCrash Exception if application crashed*/
Thread.setDefaultUncaughtExceptionHandler (new Thread.UncaughtExceptionHandler()
{
@Override
public void uncaughtException (Thread thread, Throwable e)
{
/** Check whether it is development or release mode*/
if(BuildConfig.REPORT_CRASH)
{
FirebaseCrash.report( e);
}
}
});
versionCode
ローカル/本番ビルドのフィルターとして使用します。
gradle.properties
VERSION_CODE=1
app/build.gradle
android {
defaultConfig {
versionCode VERSION_CODE as int
}
}
新しいバージョンのアプリを公開するときは、コマンド ラインから新しい値を設定するだけです。
./gradlew build -PVERSION_CODE=new_value
それ以外の場合、Android Studio からビルドするとversionCode
、常に同じ が返されるため、Firebase コンソールでクラッシュ レポートを簡単に区別できます。