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

77
我已成功实现了 Firebase Crash Reporting,但需要在应用程序运行时撤销“debug”构建变体并禁用该服务,以避免在开发期间控制台出现非真实崩溃。
官方文档没有说明这一点。

if (!development) { FirebaseCrash.report(e);} - James Parsons
1
谢谢,@James_Parsons,但我不是指那个。我需要禁用自动崩溃报告,而不仅仅是手动调用API。 - facundomr
releaseCompile 'com.google.firebase:firebase-crash:9.8.0' 这个不行吗?它只会在你的发布版本中添加依赖项,因此在开发过程中,该库不会被添加到项目中,对吧? - Ankit Mundada
请查看此答案:https://dev59.com/_FYN5IYBdhLWcg3wzK3f#48384549 - itzhar
16个回答

48

更新:

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

旧版本答案:

就目前社区所能了解到的情况,官方还没有提供此功能的支持。我建议的最佳方法是在仪表板中为每种构建类型设置多个Firebase应用,并设置多个google_services.json文件,根据构建变量不同将其指向不同的应用程序。


23
你好,我是崩溃报告团队的成员。我们正在研究提供一种编程方式来禁用崩溃报告。我们也发现,在世界某些地区,由于法律原因,一些开发者不允许收集崩溃信息,他们也需要在运行时禁用崩溃报告的方法。 - Doug Stevenson
8
@DougStevenson,您发表评论已经有一段时间了,但我似乎找不到任何禁用自动崩溃报告的方法。目前有没有任何方法可以做到这一点? - Alin
5
有关此答案的更多详细信息,请参见:https://firebase.googleblog.com/2016/08/organizing-your-firebase-enabled-android-app-builds.html。 - Frank
3
抱歉,目前还没有可用的内容。如果你在 Twitter 上关注 Firebase(或者关注我 CodingDoug),你很可能会通过那里了解到任何新内容。 - Doug Stevenson
7
在Google Play Services 11.0版本中,你现在可以在运行时禁用崩溃报告。FirebaseCrash.setCrashCollectionEnabled(!BuildConfig.DEBUG); - Tyler Carberry
显示剩余6条评论

32

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

FirebaseCrash.setCrashCollectionEnabled(!BuildConfig.DEBUG);

现在是FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(false); - Amar Ilindra

28

最近已经正式引入了禁用 Firebase 崩溃报告的可能性。您需要将 Firebase Android SDK 升级至至少 11.0.0 版本。

为此,您需要编辑您的 AndroidManifest.xml 并添加:

<meta-data
   android:name="firebase_crashlytics_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"/>
...

firebase_crash_collection_enabled 标志在 Firebase 9.2.1 版本中是否有效? - rraallvv
@rraallvv 不好意思,该功能目前还不可用。 - evi
这是一个很棒的解决方案,基于禁用Crashlytics的文档机制。顺便说一下,清单键现在是“firebase_crashlytics_collection_enabled”。 - Leon
@Leon,抱歉老兄,你错了。这种方法是在清单中启用/禁用事物的Android标准事实,它与Crashlytics文档使用的方法类似完全是随机的! - evi
不是 "firebase_crash_collection_enabled" 而是 "firebase_crashlytics_collection_enabled" - 来自 https://firebase.google.com/docs/crashlytics/customize-crash-reports - Alex Shevelev
Firebase Crashlytics是一个不同的产品,这里我们指的是Firebase崩溃报告,现在已经被弃用。 - evi

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
        }
    });
}

这样做是因为它使用包含 Firebase 处理程序的旧处理程序(oldHandler)

 final UncaughtExceptionHandler oldHandler = Thread.getDefaultUncaughtExceptionHandler();

处理路径之外


11

你可以将Firebase的崩溃依赖项更改为仅发布的依赖项。

要完成此操作,您需要将其定义为releaseCompile依赖项。

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

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

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

6
FYI,即使使用这种方法,Firebase 似乎仍将所有崩溃保存在数据库中。如果您在模拟器上安装发布版本(例如测试 ProGuard),它会上传所有保存的崩溃。请注意。 - Joel

9

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

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

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

7

这个相关答案和其他答案的启发,我想出了这个方便的解决方案。

使用Timber进行日志记录,我为调试和发布构建创建了不同的Tree子类实现。在调试中,它将延迟到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/[package]/ForestFire.java

import timber.log.Timber;

public class ForestFire extends Timber.DebugTree {}

src/release/java/[package]/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());

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);
            }
        }
    });

10
对于第一部分,您可以简单地使用BuildConfig.DEBUG。(说明:该语句是一个程序代码中的指令,用于检查应用程序是否处于调试模式) - Bronx

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

编辑2:

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

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


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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接