我们通常在主线程的 Application.onCreate() 方法的早期阶段初始化 Crashlytics。Crashlytics 的初始化过程通常非常快,但在某些设备上仍可能需要超过 2 帧和长达 32 毫秒的时间。由于我们一直在改进冷启动时间,因此我们考虑将 Crashlytics 初始化置于后台线程中,问题是我们是否仍然可以在 Crashlytics 初始化之前捕获崩溃。
我们这里的方法是首先设置一个 CustomDefaultUncaughtExceptionHandler 并在后台线程中非常早地初始化 Crashlyatics。如果我们在 Crashlytics 初始化或待初始化之前发生崩溃,我们将在 CustomDefaultUncaughtExceptionHandler 中重新初始化 Crashlytics,并使用反射获取 CrashlyticsCore 的 CrashlyticsUncaughtExceptionHandler,然后记录这个未捕获的异常。
我们的问题是是否可以为我们创建一个公共方法来记录未捕获的异常,以便我们不必使用反射。或者,如果我们有其他建议可以将 Crashlytics 初始化卸载到后台线程,但也能够捕获早期异常。
伪代码如下所示:
public void uncaughtException(Thread thread, Throwable ex) {
try {
if (_crashlyticsEnabled) {
if (!_crashlyticsInitialized) {
// IMPORTANT: in case we encounter a crash before the crashlytics is
// initialized, we can initialize crashlytics here and send this crash
// to the server right away.
initCrashlytics(_context);
Crashlytics.logUncaughtException(thread, ex); // API we are asking
}
}
} catch (Exception e) {
PLog.error(e, "Exception occurred during ...");
} finally {
_defaultExceptionHandler.uncaughtException(thread, ex);
}
}