我有一个使用Fabric / crashlytics的项目。为了能够检测生产中的所有运行时错误,我想使用以下方法将(非致命的)异常发送到Crashlytics:
Crashlytics.logException(new RuntimeException("some identifiable error message");
我想将此逻辑添加到项目中我们现有的Log-class中,该类通过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不将它们视为相同的错误?
我有一个使用Fabric / crashlytics的项目。为了能够检测生产中的所有运行时错误,我想使用以下命令向Crashlytics发送(非致命的)异常:Crashlytics.logException(new ...
由于issues are grouped by the root cause of the exception,如果您使用传递给throwable
的reportError
并将其设置为您创建的异常的cause
,则应该获得所需的结果。