在使用Crashlytics SDK时,如何在发生崩溃时进行回调?

时间:2016-05-16 14:40:29

标签: android crashlytics

背景

我们使用Crashlytics SDK来管理应用崩溃并获取有关它们的所需信息。

到目前为止,SDK自动收集的信息已足够

问题

我想为每次崩溃添加更多信息,例如:可用和总堆内存,活动堆栈,......

事情是,我没有办法实现这一目标。

我知道Android框架使用未处理的异常的方式非常简单(使用Thread.setDefaultUncaughtExceptionHandler),它可能是SDK的工作方式,但我无法找到使用监听器的位置SDK本身。

我尝试了什么

  1. SDK有一个监听器,但它似乎不属于当前会话,如here所示。函数名称为" crashlyticsDidDetectCrashDuringPreviousExecution" ,意思是前一届会议。在弃用的方法之前,可以使用相同的回调。

  2. 有" Custom Logging"和" Custom Keys"功能,但是当我调用它们时会发生这些功能(发生崩溃时不正确)。

  3. 问题

    有没有办法在发生崩溃时立即向Crashlytics添加额外信息?

    若然,怎么样?

1 个答案:

答案 0 :(得分:10)

尝试创建UncaughtExceptionHandler并使用Custom Key(s)存储要与崩溃报告关联的信息。

  1. 创建自定义UncaughtExceptionHandler(ensuring that it will pass exception to default UncaughtExceptionHandler to be handled later via Crashlytics)。
  2. uncaughtException方法中添加自定义逻辑以设置密钥,例如Crashlytics.setString("available_memory", "5784");

  3. 检查您的Crashlytics信息中心,以便在您的应用崩溃时查看自定义密钥

  4. 创建一个自定义Application子类来保存逻辑:

    public class MyApplication extends Application {
       private static Thread.UncaughtExceptionHandler mDefaultUncaughtExceptionHandler;
    
       private static Thread.UncaughtExceptionHandler mCaughtExceptionHandler = new Thread.UncaughtExceptionHandler() {
           @Override
           public void uncaughtException(Thread thread, Throwable ex) {
              // Custom logic goes here
              // Calculate available memory
              Crashlytics.setString("available_memory", "5784");
              // This will make Crashlytics do its job
              mDefaultUncaughtExceptionHandler.uncaughtException(thread, ex);
           }
       };
    
       @Override
       public void onCreate() {
         super.onCreate();
    
         // Order is important!
         // First, start Crashlytics
         Crashlytics.start(this);
    
         // Second, cache a reference to default uncaught exception handler
         mDefaultUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
         // Third, set custom UncaughtExceptionHandler
         Thread.setDefaultUncaughtExceptionHandler(mCaughtExceptionHandler);
       }
    }
    

    请记住在AndroidManifest.xml的标记

    中指定Application子类的名称
    <application android:name="MyApplication">