Crashlytics Firebase с UncaughtExceptionHandler - PullRequest
0 голосов
/ 29 мая 2018

Я интегрировал Firebase Crashlytics версии 2.9.1, чтобы выявлять сбои, чтобы покрыть производительность и стабильность моего приложения.

Сбои не регистрируются на консоли аварийного отключения Firebase, если приложение имеет собственный UncaughtExceptionHandler.

В моем приложении есть BaseActivity.внутри метода onCreate () я зарегистрировал пользовательский UncaughtExceptionHandler на основе требований проекта.

Всякий раз, когда по какой-либо причине происходит сбой приложения, пользователь должен быть перенаправлен на экран-заставку (MainActivity.java).

public class BaseActivity extends FragmentActivity{ 

@Override 
protected void onCreate(Bundle arg0) { 
   // Enable global crash handler. 
   Thread.setDefaultUncaughtExceptionHandler(handleAppCrash); 
} 

/*** 
* @Purpose Called when any crash occurs in the application. 
***/ 
private Thread.UncaughtExceptionHandler handleAppCrash = new Thread.UncaughtExceptionHandler() { 
@Override 
public void uncaughtException(Thread thread, Throwable ex) { 

   Intent intent = new Intent(context, MainActivity.class); //redirect to Splash screen
   intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
   context.startActivity(intent); 
   System.exit(0); 
  } 
}; 

} 

Ответы [ 3 ]

0 голосов
/ 29 мая 2018

Установите ваш собственный обработчик исключений внутри InitializationCallback ткани, как показано ниже.

    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) {
                // Get default exception handler
                final Thread.UncaughtExceptionHandler defaultHandler = Thread.getDefaultUncaughtExceptionHandler();
                // Set your custom exception handler   
                Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
                    @Override
                    public void uncaughtException(Thread thread, Throwable ex) {
                        // redirect to Splash screen
                        Intent intent = new Intent(context, MainActivity.class);
                        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                        context.startActivity(intent);
                        // pass exception to default handler
                        defaultHandler.uncaughtException(thread, ex);
                    }
                };);
            }

            @Override
            public void failure(Exception e) {

            }
        }).build());
0 голосов
/ 24 июня 2019

ОК, я исследовал этот вопрос.

Не следует создавать собственный обработчик исключений внутри BaseActivity.Лучше сделать это в своем классе Application.В случае BaseActivity вы будете использовать новый обработчик каждый раз, когда начинаете новое действие, что расширяет вашу BaseActivity.

Таким образом, в методе класса приложения onCreate () вы можете получить обработчик приложения по умолчанию

val defaultExceptionHandler = Thread.getDefaultUncaughtExceptionHandler()

В моем случае это экземпляр

com.crashlytics.android.core.CrashlyticsUncaughtExceptionHandler

Этот "defaultExceptionHandler", который вы будете использовать для отправки правильных ошибок в firebase.Затем вы можете создать свой собственный обработчик исключений, но вам нужно держать здесь этот «defaultExceptionHandler».

class DefaultExceptionHandler (private val  defaultExceptionHandler:Thread.UncaughtExceptionHandler?) : Thread.UncaughtExceptionHandler {
override fun uncaughtException(thread: Thread, ex: Throwable) {
        try {       
            // here you restore your activity and do other things
            // and of course you deal with defaultExceptionHandler
            // without it firebase will not work       
            defaultExceptionHandler?.uncaughtException(thread, ex)
            // only after firebase dealed with an exception, you can exit
            System.exit(0)
        } catch (e: IOException) {
            // just catch
        }

        }
    }

И, наконец, firebase покажет вам сбои по мере необходимости.Пример применения onCreate ()

override fun onCreate() {
        super.onCreate()
        Fabric.with(this, Crashlytics())
        val defaultExceptionHandler = Thread.getDefaultUncaughtExceptionHandler()
        val customExceptionHandler = DefaultExceptionHandler(defaultExceptionHandler)
        Thread.setDefaultUncaughtExceptionHandler(customExceptionHandler)
    }
0 голосов
/ 29 мая 2018

Пытались ли вы обновить до последней версии:

implementation 'com.crashlytics.sdk.android:crashlytics:2.9.3'

И службы Google (уровень проекта):

classpath 'com.google.gms:google-services:4.0.1'

Убедитесь, что все обновлено.Это последнее обновление библиотек Firebase, основанное на этой ссылке , вы можете проверить ниже:

implementation 'com.google.firebase:firebase-core:16.0.0'
implementation 'com.google.firebase:firebase-ads:15.0.1'
implementation 'com.google.firebase:firebase-analytics:16.0.0'
implementation 'com.google.firebase:firebase-appindexing:15.0.1'
implementation 'com.google.firebase:firebase-auth:16.0.1'
implementation 'com.google.firebase:firebase-firestore:17.0.1'
implementation 'com.google.firebase:firebase-functions:16.0.1'
implementation 'com.google.firebase:firebase-messaging:17.0.0'
implementation 'com.google.firebase:firebase-storage:16.0.1'
implementation 'com.google.firebase:firebase-crash:16.0.0'
implementation 'com.google.firebase:firebase-invites:16.0.0'
implementation 'com.google.firebase:firebase-perf:16.0.0'
implementation 'com.google.firebase:firebase-database:16.0.1'
implementation 'com.google.firebase:firebase-config:16.0.0'
...