我们通常在主线程的Application.onCreate()方法的早期阶段初始化Crashlytics。 Crashlytics的初始化过程通常非常快,但在某些设备上仍可能需要超过2帧且长达32ms。由于我们不断改进冷启动时间,我们考虑将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);
}
}