Java和Android崩溃捕获机制

 更新时间:2023年07月28日 10:32:09   作者:尹学姐  
这篇文章主要为大家介绍了Java和Android崩溃捕获机制详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

作为开发同学,每天都在面临各种各种的崩溃问题。

我们都如果在Android应用中发生了未捕获的崩溃问题,不管是在主线程还是在子线程,应用都会直接退出。
但是Java程序,子线程抛出的异常,不会引起程序的退出。

那你们知道JVM是如何处理应用未捕获崩溃的吗?Android又是怎样在发生崩溃时让程序退出的呢?

崩溃处理机制

当一个线程抛出异常时,JVM会调用线程的dispatchUncaughtException方法,所有未被捕获的异常,最后都会交给UncaughtExceptionHandler处理。

对于一个线程来说,UncaughtExceptionHandler有多个,首先有针对单个线程的unCaughtExceptionHandler,然后还有静态的首先有一个静态的defaultUncaughtExceptionHandlerdefaultUncaughtPreExceptionHandler,这个是对每个线程都生效的。

处理顺序:未捕获的异常,先由线程处理,然后由线程的ThreadGroup处理,最后再由默认异常处理程序处理。

Android发生崩溃后

为什么Android发生异常后,不管是在主线程还是在子线程,都会引起程序crash退出呢?

其实是因为Android给所有线程都设置了一个defaultExceptionHandler,这个ExceptionHandler的处理逻辑就是让程序退出。

下面我们来看源码。

在应用程序被创建的时候,RuntimeInit会设置一个默认的异常处理Handler,这个异常处理Handler就是KillApplicationHandler。从名字就可以看出,这个Handler主要负责杀掉App进程。

// RuntimInit
protected static final void commonInit() {
    LoggingHandler loggingHandler = new LoggingHandler();
    // 设置preExceptionHandler
    Thread.setUncaughtExceptionPreHandler(loggingHandler);
    // KillApplicationHandler 作为全局 Handler
    Thread.setDefaultUncaughtExceptionHandler(new KillApplicationHandler(loggingHandler));
    //...
}

KillApplicationHandler会先调用loggingHandler打印日志,然后杀掉当前进程。

   private static class KillApplicationHandler implements Thread.UncaughtExceptionHandler {
        private final LoggingHandler mLoggingHandler;
        public KillApplicationHandler(LoggingHandler loggingHandler) {
            // 传入loggingHandler用于打日志
            this.mLoggingHandler = Objects.requireNonNull(loggingHandler);
        }
        @Override
        public void uncaughtException(Thread t, Throwable e) {
            try {
                // 打日志
                ensureLogging(t, e);
                // 已经在crash中了,不处理了
                if (mCrashing) return;
                mCrashing = true;
                // ...
            } catch (Throwable t2) {
                // ...
            } finally {
                // 通知内核杀掉进程
                Process.killProcess(Process.myPid());
                // 停止VM
                System.exit(10);
            }
        }

所以,当出现未捕获的异常时,会交给KillApplicationHandler中的uncaughtException,从而直接让程序退出。与此同时,我们也可以从adb日志中看到崩溃的具体堆栈。

下一篇,我们讲讲如何借用 uncaughtExceptionHandler的原理来实现Android应用永不崩溃。

以上就是Java和Android崩溃捕获机制的详细内容,更多关于Java Android崩溃捕获的资料请关注脚本之家其它相关文章!

相关文章

  • 利用Java编写24点小游戏的实例代码

    利用Java编写24点小游戏的实例代码

    这篇文章主要给大家介绍了关于如何利用Java编写24点小游戏的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 详解如何使用ModelMapper库进行对象之间的属性映射

    详解如何使用ModelMapper库进行对象之间的属性映射

    这篇文章主要介绍了如何使用ModelMapper库进行对象之间的属性映射实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • SpringBoot整合Shiro的环境搭建教程

    SpringBoot整合Shiro的环境搭建教程

    这篇文章主要为大家详细介绍了SpringBoot整合Shiro的环境搭建教程,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解一下
    2022-12-12
  • spring初始化源码之关键类和扩展接口详解

    spring初始化源码之关键类和扩展接口详解

    Spring就是一个大工厂,可以将所有对象的创建和依赖关系的维护交给Spring管理,下面这篇文章主要给大家介绍了关于spring初始化源码之关键类和扩展接口的相关资料,需要的朋友可以参考下
    2023-04-04
  • 老生常谈java中cookie的使用

    老生常谈java中cookie的使用

    下面小编就为大家带来一篇老生常谈java中cookie的使用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • Go Java算法之K个重复字符最长子串详解

    Go Java算法之K个重复字符最长子串详解

    这篇文章主要为大家介绍了Go Java算法之K个重复字符最长子串详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 基于Springboot使用logback的注意事项

    基于Springboot使用logback的注意事项

    这篇文章主要介绍了Springboot使用logback的注意事项,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • SpringBoot Security整合JWT授权RestAPI的实现

    SpringBoot Security整合JWT授权RestAPI的实现

    这篇文章主要介绍了SpringBoot Security整合JWT授权RestAPI的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • 使用IDEA如何打包发布SpringBoot并部署到云服务器

    使用IDEA如何打包发布SpringBoot并部署到云服务器

    这篇文章主要介绍了使用IDEA如何打包发布SpringBoot并部署到云服务器问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • JavaWeb中的Cookie和Session解读

    JavaWeb中的Cookie和Session解读

    这篇文章主要介绍了JavaWeb中的Cookie和Session解读,Cookie是servlet发送到Web浏览器的少量信息,该信息由浏览器保存,然后发送回服务器,一般情况下,Cookie是以键值对进行表示的,Cookie的值可以唯一地标识客户端,因此Cookie常用于会话管理,需要的朋友可以参考下
    2023-10-10

最新评论