| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> Android-如何自定义crash处理器 -> 正文阅读 |
|
[移动开发]Android-如何自定义crash处理器 |
自定义CrashHandler前言开发app过程中我,我们经常会遇到程序崩溃的问题,默认的处理方式是弹出一个crash的对话,点击后程序就会被关闭,与此同时,log日志也会有响应的错误栈打印。 那有没有办法在程序崩溃时,自行处理crash,比如将错误日志输出后,上传到服务器,然后重启app。这种场景就需要我们去自定义崩溃处理流程。 本文分为三部分,第一部分对android源码的crash流程进行分析,第二部分介绍如何自定义一个崩溃处理器,第三部分介绍如何去处理jni层的崩溃。 一、 Java层Crash源码流程分析。我们先来看下源码的RuntimeInit.class类,该类有一个静态的main方法,该方法会在android启动的过程中,被调用。 我们来看下CommonInit(),这里对线程设置了一个默认的异常处理器,从名字中也可以看出,设置的是java层未捕获的异常处理。 KillApplicationHandler:负责处理关闭app的处理器。 LoggingHandler:负责处理相关日志。 先来看下KillApplicationHandler:
最后会尝试杀死线程并退出。 整个报错流程就结束了,我们回头再来看下日志相关handler的处理。 主要就是处理日志的输出。 整个崩溃处理流程的源码相对来说还是比较简单,不难发现,如果要自定义处理器,那么有两个关键点。
有了以上的分析,接下来我们来自定义一个crashHandler处理器。 二、 Java层自定义crashHandler,自行处理崩溃。首先我们要定义一个类,先实现相关接口,对外暴露一个init方法,该方法中,首先存储了默认的处理器(目的是,如果后面需要用到默认处理器,还能进行调用),接下来设置了我们当前自定义的处理器。 接下来就是重写handleException方法,定义对错误的处理。这里我们是通过一个流,将错误相关信息,写到了本地。最后在finally中,我们还可以直接调用系统默认的方法,关闭当前app。 假设如果不走系统的调用,则当前app会一直黑屏,无法退出。所以建议如果没有特殊的业务需求,在finally中,还是要调用下默认的处理机制。 至此,java层的异常处理机制就结束了。 三、 Jni层Crash处理。
对于jni层的crash,处理起来会比java层麻烦很多,因为在jni层,报错通常是以信号量signal。当Linux应用程序在执行时发生严重错误,一般会导致程序崩溃。其中,Linux专门提供了一类crash信 号,在程序接收到此类信号时,缺省操作是将崩溃的现场信息记录到核心文件,然后终止进程。 当jni层发生异常时,会产生一个墓碑文件记录崩溃的现场信息的文件,而这个文件在Android系统中就是 tombstones 墓碑文件。(墓碑文件位于路径/data/tombstones/下 ) 这里需要借助Google的breakpad,一个跨平台的崩溃转储和分析框架和工具集合,其开源地址是:https://github.co m/google/breakpad。 breakpad在Linux中的实现就是借助了Linux信号捕获机制实现的。因为其实现 为C++,因此在Android中使用,必须借助NDK工具。 接下来我们来看具体实现。
此时,若发生crash,DumpCallback将收到回调。我们可以直接在jni层中去做crash的相关处理,也可以将crash继续往上回调,交由java层去处理。 |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 7:14:37- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |