簡體   English   中英

Crashlytics Android SDK - 自定義 UncaughtExceptionHandler

[英]Crashlytics Android SDK - custom UncaughtExceptionHandler

是否可以在一個應用程序中合並自定義 UncaughtExceptionHandler 和 crashlytics? 如果是 - 如何?

更新

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

第二種選擇是設置自定義 UncaughtExceptionHandler注冊 Crashlytics - 然后所有未捕獲的異常將由 Crashlytics 報告為致命異常,然后傳遞給您的自定義處理程序。

由於最新版本的 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());

對的,這是可能的。

在您的應用程序類中:

@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);
}
  1. 關閉自動收集

    將此添加到您的AndroidManifest.xml

<meta-data
     android:name="firebase_crashlytics_collection_enabled"
     android:value="false" />
  1. 注冊您的客戶UncaughtExceptionHandler
Thread.setDefaultUncaughtExceptionHandler(customerUncaughtExceptionHandler)
  1. 注冊 UncaughtExceptionHandler 后手動啟動 Crashlytics
Fabric.with(this, new Crashlytics());
  1. 重建並重新安裝您的應用程序

我找到了 Fabric 2.10.1 的解決方案:

Thread.setDefaultUncaughtExceptionHandler(yourExceptionHandler)
Fabric.with(this, Crashlytics())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM