Можно ли включить пользовательский UncaughtExceptionHandler вместе с крашлитикой в одно приложение? Если да - как?
Crashlytics Android SDK — пользовательский UncaughtExceptionHandler
Ответы (6)
Поскольку последние версии Crashlytics выполняют инициализацию асинхронно, лучше использовать обратный вызов инициализации Fabric:
private static Thread.UncaughtExceptionHandler mDefaultUEH;
private static Thread.UncaughtExceptionHandler mCaughtExceptionHandler =
new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable ex) {
// Custom logic goes here
// This will make Crashlytics do its job
mDefaultUEH.uncaughtException(thread, ex);
}
};
CrashlyticsCore core = new CrashlyticsCore.Builder()
.disabled(BuildConfig.DEBUG)
.build();
Fabric.with(new Fabric.Builder(this).kits(new Crashlytics.Builder()
.core(core)
.build())
.initializationCallback(new InitializationCallback<Fabric>() {
@Override
public void success(Fabric fabric) {
mDefaultUEH = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(mCaughtExceptionHandler);
}
@Override
public void failure(Exception e) {
}
})
.build());
ОБНОВЛЕНИЕ
См. @kmityak ответ, так как инициализация Crashlytics/Fabric теперь асинхронна, и мое решение, приведенное ниже, больше не действует.
ИСХОДНЫЙ ОТВЕТ
Вы можете настроить свой собственный UncaughtExceptionHandler при условии, что он будет передавать исключение в UncaughtExceptionHandler по умолчанию, который будет обрабатываться позже через Crashlytics.
Ниже код реализован внутри подкласса Application:
private static Thread.UncaughtExceptionHandler mDefaultUEH;
private static Thread.UncaughtExceptionHandler mCaughtExceptionHandler = new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable ex) {
// Custom logic goes here
// This will make Crashlytics do its job
mDefaultUEH.uncaughtException(thread, ex);
}
};
@Override
public void onCreate() {
super.onCreate();
// Order is important!
// First, start Crashlytics
Crashlytics.start(this);
// Second, set custom UncaughtExceptionHandler
mDefaultUEH = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(mCaughtExceptionHandler);
}
Второй вариант — зарегистрировать Crashlytics после установки своего пользовательского UncaughtExceptionHandler — тогда все неперехваченные исключения будут сообщены Crashlytics как фатальные, а затем переданы вашему пользовательскому обработчику.
Crashlytics.start(this)
. Я использую crashlytics:2.5.1
. Я просто хочу выйти из своего приложения, а также отправить отчет в Fabric. Как я могу это сделать?
- person SweetWisher ツ; 31.08.2015
Fabric.with(this, Crashlytics())
вместо Crashlytics.start(this)
- person Tej; 07.09.2017
... inside Application subclass
. Благодарю вас!
- person Mr. B.; 12.10.2017
Да, это возможно.
В вашем классе приложения:
@Override
public void onCreate() {
super.onCreate();
Crashlytics.start(this);
initUncaughtExceptionHandler();
}
private void initUncaughtExceptionHandler() {
final ScheduledThreadPoolExecutor c = new ScheduledThreadPoolExecutor(1);
c.schedule(new Runnable() {
@Override
public void run() {
final UncaughtExceptionHandler defaultHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread paramThread, Throwable paramThrowable) {
// do my amazing stuff here
System.err.println("Error!");
//then pass the job to the previous handler
defaultHandler.uncaughtException(paramThread, paramThrowable);
}
});
}
}, 5, TimeUnit.SECONDS);
}
Причина, по которой я планирую это через 5 секунд, заключается в том, что Crashlytics нужно некоторое время, чтобы настроить свои вещи. Я использую этот код, и он отлично работает. Конечно, если ваше приложение вылетает при запуске, извините, но нет специального обработчика;)
Нет, если эти решения сработали для меня. Я сделал это следующим образом:
// Setup handler for uncaught exceptions.
Thread.setDefaultUncaughtExceptionHandler (new Thread.UncaughtExceptionHandler()
{
@Override
public void uncaughtException (Thread thread, Throwable e)
{
//Send Report to Crashlytics. Crashlytics will send it as soon as it starts to work
Crashlytics.logException(e);
//Your custom codes to Restart the app or handle this crash
HandleCrashes(thread, e);
}
});
А вот мой пользовательский метод для перезапуска приложения:
private void HandleCrashes(Thread t, Throwable e) {
Intent i = new Intent(mContext, frmLogin.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.putExtra("JustLogin", true);
startActivity(i);
System.exit(1);
}
Отключить автоматический сбор
добавь это в свой
AndroidManifest.xml
<meta-data
android:name="firebase_crashlytics_collection_enabled"
android:value="false" />
- Зарегистрируйте свой клиент
UncaughtExceptionHandler
Thread.setDefaultUncaughtExceptionHandler(customerUncaughtExceptionHandler)
- Запуск Crashlytics вручную после регистрации UncaughtExceptionHandler
Fabric.with(this, new Crashlytics());
- пересоберите и переустановите приложение
Я нашел решение для Fabric 2.10.1:
Thread.setDefaultUncaughtExceptionHandler(yourExceptionHandler)
Fabric.with(this, Crashlytics())