Оборачивание обработчика по умолчанию

тели заменить неперехваченное исключение по умолчанию, чтобы диалоговое окно сбоя по умолчанию не отображалось.

Проблема было ли это, если вы позвонитеThread.setDefaultUncaughtExceptionHandler(YourHandler) затем в случае исключения приложение «зависает», и вы получаете диалог ANR (приложение не отвечает). Мы экспериментировали сSystem.exit() а такжеProcess.killProcess() который решил проблему, но из прочтения по этому вопросу казалось, что это не рекомендуется.

Так как это можно сделать правильно?

Ответы на вопрос(1)

Решение Вопроса
TL; DR

ний по умолчанию вcom.android.internal.os.RuntimeInit.UncaughtHandler пропуская часть, которая показывает диалог.

Drilldown

Сначала ясно, чтоSystem.exit() а такжеProcess.killProcess() являются обязательными в сценарии, где происходит сбой приложения (по крайней мере, так думают люди в Google).
Важно отметить, чтоcom.android.internal.os.RuntimeInit.UncaughtHandler может (и может) меняться между выпусками фреймворка, также некоторый код в нем не доступен для вашей собственной реализации
Если вас не интересует диалоговое окно сбоя по умолчанию, и вы просто хотите что-то добавить в обработчик по умолчанию, вам следует обернуть обработчик по умолчанию. (см. внизу, например)

Наш обработчик по умолчанию Uncaught Exception (без диалога)
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable ex) {
    try {
        // Don't re-enter -- avoid infinite loops if crash-reporting crashes.
        if (mCrashing) {
            return;
        }
        mCrashing = true;

        String message = "FATAL EXCEPTION: " + t.getName() + "\n" + "PID: " + Process.myPid();
        Log.e(TAG, message, ex);
    } catch (Throwable t2) {
        if (t2 instanceof DeadObjectException) {
            // System process is dead; ignore
        }
        else {
            try {
                Log.e(TAG, "Error reporting crash", t2);
            } catch (Throwable t3) {
                // Even Log.e() fails!  Oh well.
            }
        }
    } finally {
        // Try everything to make sure this process goes away.
        Process.killProcess(Process.myPid());
        System.exit(10);
    }
}

})

Оборачивание обработчика по умолчанию
final Thread.UncaughtExceptionHandler defHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
    @Override
    public void uncaughtException(Thread t, Throwable ex) {
        try {
            //your own addition 
        } 
        finally {
            defHandler.uncaughtException(t, ex);
        }
    }
});

Ваш ответ на вопрос