使用自定义异常处理程序重启应用的Firebase Crashlytics

Mar*_*rdo 5 java android firebase crashlytics crashlytics-android

问题:我正在一个旧项目(这是一个非常特定的项目)中工作,这需要我们有一个自定义异常处理程序来拦截异常,在崩溃发生之前将其杀死,然后重新启动该应用程序(不显示崩溃对话框)。

我试过的

我正在使用以下自定义异常处理程序重新启动应用程序进程:

public class UncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {

    (…)

    @Override
    public void uncaughtException(final Thread thread, final Throwable throwable) {
        (…)

        AppUtils.restartApplication(context);
    }

}
Run Code Online (Sandbox Code Playgroud)

这是AppUtils.restartApplication(context)代码:

public final class AppUtils {

    (…)

    public static void restartApplication(@NonNull final Context context) {
        startApplication(context);
        closeApplication();
    }

    private static void startApplication(@NonNull final Context context) {
        final Intent rescueIntent = new Intent(context, Activity.class);
        rescueIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        final PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, rescueIntent, rescueIntent.getFlags());
        final AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC, DateTime.now().plusSeconds(1).getMillis(), pendingIntent);
    }

    private static void closeApplication() {
        Process.killProcess(Process.myPid());
        System.exit(SYSTEM_EXIT_STATUS_FORCE_QUIT);
    }

}
Run Code Online (Sandbox Code Playgroud)

在我们使用Splunk之前,它工作得很好。但是现在我需要为Firebase Crashlytics添加支持,而Crashlytics拥有ExceptionHandler。

因此,我遇到了两种不适合我的方案:

  1. 不要重新启动应用程序,因此我可以使用Firebase正常登录;
  2. 重新启动该应用程序,因此无法使用Firebase进行记录;

我尝试使用logException自定义异常处理程序中的Crashlytics中的方法绕过它,将所有日志记录为非致命错误,但效果不是很好:有时它记录正确,有时却没有。我相信这是由于Firebase inicializationlogException方法中的异步而发生的。

我将不胜感激任何帮助或建议。谢谢。