# DefenseCrash **Repository Path**: Mrsunbw/DefenseCrash ## Basic Information - **Project Name**: DefenseCrash - **Description**: Android防崩溃框架 - **Primary Language**: Kotlin - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2021-04-11 - **Last Updated**: 2024-01-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #### Android App防崩溃框架 ##### 一、初始化 在Application onCreate()方法中进行初始化 ``` DefenseCrash.install(context, object : ExceptionHandler() { override fun onUncaughtExceptionHappened(thread: Thread, throwable: Throwable) { Log.e("DefenseCrash", "onUncaughtExceptionHappened->" + throwable.localizedMessage) } override fun onBandageExceptionHappened(throwable: Throwable) { Log.e("DefenseCrash", "onBandageExceptionHappened->" + throwable.localizedMessage) } override fun onEnterSafeMode() { Log.e("DefenseCrash", "onEnterSafeMode") } override fun onMayBeBlackScreen(throwable: Throwable) { Log.e("DefenseCrash", "onMayBeBlackScreen->" + throwable.localizedMessage) //黑屏时应杀死进程 exitProcess(0) } }) ``` ##### 二、框架原理 第一步、通过替换ActivityThread.mH.mCallback,实现拦截Activity生命周期。当在生命周期方法中出现异常时,则通过调用ActivityManager的finishActivity结束掉生命周期抛出异常的Activity 第二步、自定义Thread.UncaughtExceptionHandler,当出现异常时,会进入while死循环,如果while内部是空的就会导致代码卡在这里,最终导致ANR,但在while死循环中又调用了Looper.loop(),这就导致主线程又开始不断的读取queue中的Message并执行,这样就可以保证以后主线程的所有异常都会从我们手动调用的Looper.loop()处抛出,一旦抛出就会被try{}catch捕获,这样主线程就不会crash了,如果没有这个while的话那么主线程下次抛出异常时我们就又捕获不到了,这样APP就又crash了,所以我们要通过while让每次crash发生后都再次进入消息循环,while的作用仅限于每次主线程抛出异常后迫使主线程再次进入消息循环。 ``` while (true) { try { Looper.loop() } catch (t: Throwable) { isChoreographerException(t) sExceptionHandler?.bandageExceptionHappened(t) } } ```