处理 Fabric/Crashlytics 中的错误分组

Posted

技术标签:

【中文标题】处理 Fabric/Crashlytics 中的错误分组【英文标题】:Handle grouping of errors in Fabric/Crashlytics 【发布时间】:2018-02-22 11:50:29 【问题描述】:

我有一个使用 Fabric/crashlytics 的项目。为了能够检测生产中的所有运行时错误,我想使用以下命令向 Crashlytics 发送(非致命)异常:

Crashlytics.logException(new RuntimeException("some identifiable error message");

我想将此逻辑添加到项目中现有的日志类中,该日志类通过 gradle 作为单独的“实用程序模块”加载。由于此模块不包含对 Crashlytics 的引用(而且我似乎找不到从主模块转发此引用的好方法),因此我通过引入一个从主应用程序实现的接口来解决它:

if (!BuildConfig.APP_BUILD_VERSION.equals("local")) 
        UtilitiesConfig.setExternalLogger(new Logger.ExternalLogger() 
            @Override
            public void reportError(String tag, String message, Throwable throwable) 
                Crashlytics.logException(new RuntimeException(TextUtils.isEmpty(tag) ? message : tag + ": " + message));
            
        );
    

这很好用,唯一的问题是 Fabric 中的所有报告都被归为一个类似的异常,因为堆栈跟踪的顶部行是相似的(即接口和应用程序)。例如:

Non-fatal Exception: java.lang.RuntimeException: c: onNetworkError, type: CANT_ACCESS_SERVER
   at my.package.Application$3.reportError(Application.java:234)
   at my.package.utilities.Logger.e(Logger.java:34)
   at my.package.utilities.net.CallbackCallable.onNetworkError(CallbackCallable.java:76)
   at my.package.utilities.net.MsgCallable.onNetworkError(MsgCallable.java:250)
   at my.package.utilities.net.CancellableCallable.call(CancellableCallable.java:80)
   at java.util.concurrent.FutureTask.run(FutureTask.java:237)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
   at java.lang.Thread.run(Thread.java:776)

...还有这个:

Non-fatal Exception: java.lang.RuntimeException: u: Cannot update
   at my.package.Application$3.reportError(Application.java:234)
   at my.package.utilities.Logger.e(Logger.java:43)
   at my.package.NTPManager$SyncTimeAsyncTask.doInBackground(NTPManager.java:150)
   at my.package.NTPManager$SyncTimeAsyncTask.doInBackground(NTPManager.java:133)
   at android.os.AsyncTask$2.call(AsyncTask.java:304)
   at java.util.concurrent.FutureTask.run(FutureTask.java:237)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
   at java.lang.Thread.run(Thread.java:762)

尽管它们是源自不同类/行并带有不同错误消息的两个不同错误,但它们都被组合在一起。

是否有一种有效的方法来更改 Crashlytics 中的某些配置,或者通过所述回调以另一种方式报告它,从而使 Fabric 不认为它们是相同的错误?

【问题讨论】:

我们没有支持在 UI 或 SDK 中手动中断分组的方法。我会让团队知道你有兴趣。 【参考方案1】:

由于issues are grouped by the root cause of the exception,如果您使用传递给reportErrorthrowable 并将其设置为您创建的异常的cause,您应该会得到想要的结果。

if (!BuildConfig.APP_BUILD_VERSION.equals("local")) 
    UtilitiesConfig.setExternalLogger(new Logger.ExternalLogger() 
        @Override
        public void reportError(String tag, String message, Throwable throwable) 
            String logMessage = TextUtils.isEmpty(tag) ? message : tag + ": " + message;
            Crashlytics.logException(new RuntimeException(logMessage, throwable));
        
    );

【讨论】:

太好了,似乎自从我发布问题以来,我们在某些情况下通过了 throwable,并且这些(就像你描述的那样)是单独报告的。如果你不告诉我,我就不会弄清楚其中的联系。 :) 是的,它也让我感到困惑,并且花了相当多的实验来弄清楚;)

以上是关于处理 Fabric/Crashlytics 中的错误分组的主要内容,如果未能解决你的问题,请参考以下文章

通过 CocoaPods 集成 Fabric/Crashlytics

iOS(Fabric):Crashlytics 在启动时崩溃应用程序

Fabric(Crashlytics):最新版本在“最新版本”部分不可见

Fabric/Crashlytics NoClassDefFoundError 仅在某些设备上

Fabric Crashlytics 与 Angular Web 应用程序

如何从 Fabric Crashlytics 迁移到 Firebase Crashlytics?