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

How to have a callback for when a crash occurred, while using Crashlytics SDK?

背景

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

至此,SDK自动收集的信息已经足够了

问题

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

问题是,我没有找到实现此目标的方法。

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

我试过的

  1. SDK有监听器,但好像不是当前会话的监听器,如图。函数名称是 "crashlyticsDidDetectCrashDuringPreviousExecution" ,这意味着它是上一个会话的。之前在弃用的方法中提供了相同的回调。

  2. 有“Custom Logging" and "Custom Keys”的特性,但是当我调用它们时会出现(当崩溃发生时不正确)。

问题

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

如果是,怎么做?

尝试创建 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 仪表板以查看您的应用程序崩溃时的自定义密钥

创建自定义应用程序子类来保存您的逻辑:

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 android:name="MyApplication">