Crashlytics Android SDK - custom UncaughtExceptionHandler

前端 未结 6 1938
星月不相逢
星月不相逢 2020-11-29 05:34

Is it possible to incorporate custom UncaughtExceptionHandler along with crashlytics in one application? If yes - how?

相关标签:
6条回答
  • 2020-11-29 06:19

    UPDATE

    Please see @kmityak answer as Crashlytics/Fabric initialization is now asynchronous and my solution below is no longer valid.

    ORIGINAL ANSWER

    You can set your custom UncaughtExceptionHandler providing that it will pass exception to default UncaughtExceptionHandler to be handled later via Crashlytics.

    Below code is implemented inside Application subclass:

    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);
    }
    

    Second option is to register Crashlytics after setting your custom UncaughtExceptionHandler - then all uncaught exceptions will be reported by Crashlytics as fatals, and after that passed to your custom handler.

    0 讨论(0)
  • 2020-11-29 06:23
    1. Turn off automatic collection

      add this to your AndroidManifest.xml

    <meta-data
         android:name="firebase_crashlytics_collection_enabled"
         android:value="false" />
    
    1. Register your custome UncaughtExceptionHandler
    Thread.setDefaultUncaughtExceptionHandler(customerUncaughtExceptionHandler)
    
    1. Manually start Crashlytics after registered UncaughtExceptionHandler
    Fabric.with(this, new Crashlytics());
    
    1. rebuild and reinstall your Application
    0 讨论(0)
  • 2020-11-29 06:28

    None if those solutions worked for me. I did it like following:

    // 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);
        }
    });
    

    And here is my Custom Method to restart the APP:

    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);
    }
    
    0 讨论(0)
  • 2020-11-29 06:36

    Yes, it is possible.

    In your Application class:

    @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);
    }
    

    The reason I'm scheduling this after 5 seconds is because Crashlytics needs some time to set up his stuff. I'm using this code and it works perfectly. Of course if your app crashes on start, sorry but no custom handler ;)

    0 讨论(0)
  • 2020-11-29 06:39

    Since recent versions of Crashlytics perform initialization asynchronously, it's better to use Fabric's initialization callback:

    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());
    
    0 讨论(0)
  • 2020-11-29 06:39

    I found a solution for Fabric 2.10.1:

    Thread.setDefaultUncaughtExceptionHandler(yourExceptionHandler)
    Fabric.with(this, Crashlytics())
    
    0 讨论(0)
提交回复
热议问题