如何在调试时运行应用程序时禁用Firebase崩溃报告?

时间:2016-05-23 17:12:28

标签: android firebase firebase-crash-reporting

我已成功实施Firebase崩溃报告,但我需要在应用运行时停用该服务撤消“调试”#39;构建变体,以避免在开发过程中控制台中出现非真实崩溃。

官方文件没有说明这一点。

16 个答案:

答案 0 :(得分:46)

更新: 借助Google Play Services / Firebase 11+,您现在可以在运行时禁用崩溃报告。 FirebaseCrash.setCrashCollectionEnabled()(谢谢@Tyler Carberry

老答案:

就社区能够推测而言,没有官方支持。我建议这样做的最佳方法是,在信息中心设置多个Firebase应用,每个版本类型一个,并根据构建版本设置多个指向每个不同应用的google_services.json文件。

答案 1 :(得分:29)

借助Google Play Services 11.0,您现在可以在运行时禁用崩溃报告。

FirebaseCrash.setCrashCollectionEnabled(!BuildConfig.DEBUG);

答案 2 :(得分:23)

Recently介绍了以官方方式停用Firebase崩溃报告的可能性。您需要将firebase android sdk升级到至少版本11.0.0

为此,您需要修改AndroidManifest.xml并添加:

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

<application>区块内。

您可以使用FirebaseCrash.isCrashCollectionEnabled()检查运行时是否启用了Firebase崩溃报告。

下面是一个完整的示例,用于在调试版本中禁用Firebase崩溃报告。

<强>的build.gradle

...
 buildTypes {

    release {
        ...
        resValue("bool", "FIREBASE_CRASH_ENABLED", "true")
    }

    debug {
        ...
        resValue("bool", "FIREBASE_CRASH_ENABLED", "false")

    }

}
...
dependencies {
    ...
    compile "com.google.firebase:firebase-core:11.0.0"
    compile "com.google.firebase:firebase-crash:11.0.0"
    ...
}

<强>的AndroidManifest.xml

 <application>

    <meta-data
        android:name="firebase_crash_collection_enabled"
        android:value="@bool/FIREBASE_CRASH_ENABLED"/>
...

答案 3 :(得分:11)

在我的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
        }
    });
}

它的工作原理是因为它需要oldHandler,其中包含Firebase一个

 final UncaughtExceptionHandler oldHandler = Thread.getDefaultUncaughtExceptionHandler();

超出处理路径

答案 4 :(得分:11)

您可以将firebase崩溃依赖项更改为仅发布依赖项。

为此,您将其定义为releaseCompile依赖项

releaseCompile 'com.google.firebase:firebase-crash:9.4.0'

现在它只会包含在发布版本中。如果您有其他想要崩溃报告的自定义构建类型,可以将其添加到。

customBuildTypeCompile 'com.google.firebase:firebase-crash:9.4.0'

答案 5 :(得分:9)

我使用的简单易用的技巧是仅在build.gradle文件中的发布版本中添加firebase崩溃报告依赖项。

这将从调试版本类型中删除崩溃报告库,并仅在发布版本中添加它。

dependencies {
    releaseCompile 'com.google.firebase:firebase-crash:10.2.0'
}

答案 6 :(得分:7)

受到this related answer和其他人的启发,我提出了这个方便的解决方案。

使用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 /调试/ JAVA / [包] /ForestFire.java

import timber.log.Timber;

public class ForestFire extends Timber.DebugTree {}

<强>的src /释放/ 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());

答案 7 :(得分:6)

首先初始化gradle文件中的变量,并检查它是处于调试模式还是处于释放模式。提交崩溃报告的最佳方法是在Application类中。

<强>的build.gradle

    buildTypes {
         release {
             buildConfigField "Boolean", "REPORT_CRASH", '"true"'
             debuggable false
         }
         debug {
             buildConfigField "Boolean", "REPORT_CRASH", '"false"'
             debuggable true
         }
    }

现在首先检查模式并在崩溃时提交崩溃报告。

<强> Application.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);
            }
        }
    });

答案 8 :(得分:4)

目前,您无法停用firebase崩溃报告,但您可以停用firebase分析。

所以一种方法是在同一个firebase项目中创建另一个具有不同ID的应用程序。在此之后,您只需更改appID即可启用或禁用firebase崩溃报告。为方便起见,我在下面创建了两个应用程序:

AppID:com.android - 适用于发布版本类型

AppID:com.android.debug - 对于调试版本类型

请点击以下链接了解更多详情:

https://firebase.googleblog.com/2016/08/organizing-your-firebase-enabled-android-app-builds.html

修改 你不需要一次又一次地在android项目中更改appID。有一种更好的方法可以将不同的appID用于调试构建类型 -

android {
    defaultConfig {
        applicationId "com.android"
        ...
    }
    buildTypes {
        debug {
            applicationIdSuffix ".debug"
        }
    }
}

查看链接以获取更多详细信息:

https://developer.android.com/studio/build/application-id.html

<强> EDIT2:

基本上在上面的解决方案中,您在Firebase项目中创建了两个不同的应用程序,这样您就可以分离开发和生产错误。

不推荐使用FYI Firebase崩溃报告。您应该使用Fabrics Crashlytics(由Google拥有)。它有一些非常酷的功能。

答案 9 :(得分:2)

FirebaseAnalytics课程。
禁用收集:setAnalyticsCollectionEnabled(false);
启用集合:setAnalyticsCollectionEnabled(true); 或写入应用程序标记中的AndroidManifest.xml<meta-data android:name="firebase_analytics_collection_enabled" android:value="false" />

可能的用途:

if (BuildConfig.DEBUG){ //disable for debug
    mFirebaseAnalytics.setAnalyticsCollectionEnabled(false);
}

Source

答案 10 :(得分:1)

首先,您必须创建debugrelease构建变体,然后使用布尔值设置变量。然后,您需要从扩展application的java文件中获取该值,即从启用Fabric崩溃报告的位置获取该值。

下面给出了一个代码示例。

在您应用的build.gradle文件中,添加以下行以创建2个构建变体debugrelease,然后添加一个带有布尔值的变量。

defaultConfig {
    buildConfigField 'boolean', 'ENABLE_ANALYTICS', 'true'
}

buildTypes {
    debug {
        applicationIdSuffix ".debug"
        versionNameSuffix 'DEBUG'
        buildConfigField 'boolean', 'ENABLE_ANALYTICS', 'false'
    }
    release {
        minifyEnabled false
    }
}

然后,当您尝试添加Fabric崩溃报告时,请检查ENABLE_ANALYTICS

的值

public class Test扩展了Application {

private GoogleAnalytics googleAnalytics;
private static Tracker tracker;

@Override
public void onCreate() {
    super.onCreate();
    if (BuildConfig.ENABLE_ANALYTICS)
        Fabric.with(this, new Crashlytics());
    }
}

您可以通过ENABLE_ANALYTICS +点击该值查看ctrl的值。希望这会有所帮助。

答案 11 :(得分:0)

我使用versionCode作为本地/生产版本的过滤器。

<强> gradle.properties

VERSION_CODE=1

应用/的build.gradle

android {
    defaultConfig {
        versionCode VERSION_CODE as int
    }
}

发布新版app时,只需从命令行设置新值:

./gradlew build -PVERSION_CODE=new_value

否则,当您从Android Studio构建时,您将始终获得相同的versionCode,因此您可以轻松区分Firebase控制台中的崩溃报告。

答案 12 :(得分:0)

如前所述 - 没有正式的方法可以做到这一点。但是我提到的最糟糕的解决方法@ mark-d是重置DefaultUncaughtExceptionHandlerhttps://stackoverflow.com/a/39322734/4245651)。

但是,如果您只是按照建议调用System.exit(2) - 应用程序将立即关闭异常,没有任何对话框消息并且很难获得调试日志。如果这对您很重要,有一种方法可以恢复默认处理程序:

if (BuildConfig.DEBUG) {
        final Thread.UncaughtExceptionHandler currentHandler = Thread.getDefaultUncaughtExceptionHandler();
        if (currentHandler.getClass().getPackage().getName()
                                                .startsWith("com.google.firebase")) {
            final Thread.UncaughtExceptionHandler defaultHandler = 
                getPrivateFieldByType(currentHandler, Thread.UncaughtExceptionHandler.class);
            Thread.setDefaultUncaughtExceptionHandler(defaultHandler);
        }
}

其中

public static <T> T getPrivateFieldByType(Object obj, Class<T> fieldType) {
    if (obj != null && fieldType != null) {
        for (Field field : obj.getClass().getDeclaredFields()) {
            if (field.getType().isAssignableFrom(fieldType)) {
                boolean accessible = field.isAccessible();
                if (!accessible) field.setAccessible(true);
                T value = null;
                try {
                    //noinspection unchecked
                    value = (T) field.get(obj);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                if (!accessible) field.setAccessible(false);
                return value;
            }
        }
    }
    return null;
}

答案 13 :(得分:0)

<div>
  Hello, <span id="name" />
</div>
<script type="text/javascript">
  document.getElementById('name').textContent = localStorage.getItem('name');
</script>

答案 14 :(得分:0)

用户在调试模式或发布模式下运行应用程序时最简单的解决方案:

  

AndroidManifest.xml:

<meta-data
            android:name="firebase_crash_collection_enabled"
            android:value="${analytics_deactivated}"/>
  

build.gradle(Module:app)

buildTypes {

        debug {
            manifestPlaceholders = [analytics_deactivated: "false"]
        }

        release {
            manifestPlaceholders = [analytics_deactivated: "true"]

        }
    }

因此,当应用程序处于发布模式时,crashlatics将被打开,而对于处于发布模式的应用程序,将被关闭

答案 15 :(得分:0)

我想最近的firebase crashlytics都有此实现。

 FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(!BuildConfig.DEBUG)