【问题标题】:How to have a callback for when a crash occurred, while using Crashlytics SDK?使用 Crashlytics SDK 时如何在发生崩溃时进行回调?
【发布时间】:2016-05-16 14:40:28
【问题描述】:

背景

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

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

问题

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

问题是,我看不到实现这一目标的方法。

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

我尝试过的

  1. SDK 有一个监听器,但它似乎不是当前会话的,如图here。函数名称为 "crashlyticsDidDetectCrashDuringPreviousExecution" ,表示它属于上一个会话。以前在已弃用的方法中也可以使用相同的回调。

  2. 有“Custom Logging”和“Custom Keys”功能,但是当我调用它们时会出现这些功能(不是在崩溃发生时)。

问题

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

如果是这样,怎么做?

【问题讨论】:

    标签: android crashlytics


    【解决方案1】:

    尝试创建一个 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">
    

    【讨论】:

    • 我想过这个,但它有效吗?这不是 Crashlytics 的工作方式吗?
    • 是的,它的工作方式与 Crashlytics 相同,但不同之处在于您的自定义 UncaughtExceptionHandler 将执行,然后您调用默认的 UncaughtExceptionHandler (Crashlytics),然后执行。
    • 我应该在 Crashlytics 初始化之前还是之后调用 Thread.setDefaultUncaughtExceptionHandler 函数?准确地放在哪里,放在什么地方?
    • 另外,crashlytics 真的像我猜的那样使用这个功能吗?
    • 有没有办法为 ndk 做同样的事情?当信号被抛出时,我需要得到回调。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    • 2019-11-14
    • 2017-08-08
    • 2020-10-20
    • 1970-01-01
    相关资源
    最近更新 更多