如何使用 Firebase (Crashlytics) 记录非致命(捕获)异常

Posted

技术标签:

【中文标题】如何使用 Firebase (Crashlytics) 记录非致命(捕获)异常【英文标题】:How to log non-fatal (caught) exceptions with Firebase (Crashlytics) 【发布时间】:2019-01-13 19:26:58 【问题描述】:

我开始在我的项目中使用 Firebase (Crashlytics) 来跟踪应用崩溃。它与崩溃完美配合,但我如何记录非致命崩溃,即捕获的异常。我试过Crashlytics.logException(e),但它不起作用。我在仪表板中看不到任何报告。我看到建议使用FirebaseCrash.report(t) 的答案,但最新版本的 Firebase 中不存在此类。那么有人知道它是怎么做的吗?

依赖关系:

implementation 'com.google.firebase:firebase-core:16.0.0'
implementation 'com.crashlytics.sdk.android:crashlytics:2.9.3'

【问题讨论】:

您是否在记录异常后杀死并重新启动了您的应用程序? 即使在最新版本的 Crashlytics 上,Crashlytics.logException(ex) 也是不错的选择。您是在调试还是发布版本上进行测试?我从来没有遇到过使用Crashlytics.logException(ex) 记录非致命事件的问题。 谢谢大家。毕竟它确实有效。似乎只需要更长的时间才能在仪表板中显示非致命异常,或者像 @DougStevenson 所说的你必须杀死并重新启动应用程序。 +1 需要终止并重新启动应用程序。我的测试应用程序有一个前台服务,所以我必须重新安装该应用程序才能在报告上传之前获得一个新进程。仅供参考,当事件被发送回 Firebase Crashlytics 时,您会在 logcat 中看到这一点:I/CrashlyticsCore: Crashlytics report upload complete: firebase 是否与 implementation 'com.crashlytics.sdk.android:crashlytics:2.9.3' 依赖同步?? 【参考方案1】:

对于新的 Firebase Crashlytics,您应该使用 recordException(@NonNull Throwable throwable)

...
catch (e: Exception) 
    FirebaseCrashlytics.getInstance().recordException(e)

...

这是firebase documentation 声明

【讨论】:

我找不到这个recordException(e) 我认为它已被删除 感谢您提供链接,许多 Firebase“入门”文档出于某种原因省略了 Crashlytics 依赖项,但您发布的“升级”指南是完整且准确的。 @miladsalimi 也许您使用的是FirebaseAnalytics 而不是FirebaseCrashlytics【参考方案2】:

你可以使用

FirebaseCrashlytics.getInstance().recordException(e)

在 crashlytics 上记录非致命问题

【讨论】:

不适用于我在我的应用程序中放入的相同代码。我每天有 3K 用户,但 firebase 没有显示一次崩溃。 请检查它是否在 Application 类中正确初始化。分享您的代码,以便我们为您提供帮助 Crashlytics 中没有名为“logException”的方法 如何在 firebase crashlytics 控制台中查看非致命日志? 见docs。您还可以使用Crashlytics.log 将其他信息附加到崩溃报告中。更多here.【参考方案3】:

确保在 Application 类中添加以下代码,这些代码附加在 AndroidManifest.xml 中 -

public class MyApplication extends Application 

    @Override
    public void onCreate() 
        super.onCreate();
        .
        .
        .
        FirebaseApp.initializeApp(this);
        FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true);
        .
        .
        .
    

然后调用预期的方法-

FirebaseCrashlytics.getInstance().recordException(myException)

【讨论】:

FirebaseApp.initializeApp(this) 不是必需的,它在由ContentProviders 初始化时由 Firebase 库在内部处理。 setCrashlyticsCollectionEnabled 也是默认启用的,afaik。【参考方案4】:

模块构建.gradle

 apply plugin: 'com.google.firebase.crashlytics'
 apply plugin: 'com.google.gms.google-services'
  android ...

 dependencies 
   implementation 'com.google.firebase:firebase-analytics-ktx:17.5.0'
   implementation 'com.google.firebase:firebase-crashlytics-ktx:17.2.1'

项目构建.gradle

   dependencies 
    classpath "com.android.tools.build:gradle:4.0.1"
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.72"
    classpath 'com.google.gms:google-services:4.3.3'
    classpath 'com.google.firebase:firebase-crashlytics-gradle:2.3.0'

MainActivity.kt

 class MainActivity : AppCompatActivity() 
    companion object 
         lateinit var mCrash: FirebaseCrashlytics           
         lateinit var instance: MainActivity
         private set
     
override fun onCreate(savedInstanceState: Bundle?) 
    super.onCreate(savedInstanceState)
         instance = this
        FirebaseApp.initializeApp(instance)
         mCrash = FirebaseCrashlytics.getInstance()
           val exception = Exception("test Exception")
           mCrash.recordException(exception)

【讨论】:

以上是关于如何使用 Firebase (Crashlytics) 记录非致命(捕获)异常的主要内容,如果未能解决你的问题,请参考以下文章

如何使用firebase_admin从python中的firebase存储下载文件

如何在不使用 Firebase 身份验证的情况下保护 Firebase 存储? (下一个)

如何使用 Firebase 实时数据库?

使用 firebase 模拟器时如何共享指向 firebase 开发环境的链接?

如何使用新的 Firebase (2016) 实现无限滚动?

如何使用 Firebase 数据库和 Firebase 通知为聊天应用构建通知系统