IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: 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:

  1. 首先调用了Log处理器,出现异常相关log

  2. 尝试停掉当前线程。

  3. 弹出错误弹窗,待用户点击确定。

最后会尝试杀死线程并退出。

整个报错流程就结束了,我们回头再来看下日志相关handler的处理。

主要就是处理日志的输出。

整个崩溃处理流程的源码相对来说还是比较简单,不难发现,如果要自定义处理器,那么有两个关键点。

  1. 需要重新设置处理器,也就是这个地方。

  1. 处理器需要实现相关接口,并重写uncaughtException方法,在方法中实现对异常的处理。

有了以上的分析,接下来我们来自定义一个crashHandler处理器。

二、 Java层自定义crashHandler,自行处理崩溃。

首先我们要定义一个类,先实现相关接口,对外暴露一个init方法,该方法中,首先存储了默认的处理器(目的是,如果后面需要用到默认处理器,还能进行调用),接下来设置了我们当前自定义的处理器。

接下来就是重写handleException方法,定义对错误的处理。这里我们是通过一个流,将错误相关信息,写到了本地。最后在finally中,我们还可以直接调用系统默认的方法,关闭当前app。

假设如果不走系统的调用,则当前app会一直黑屏,无法退出。所以建议如果没有特殊的业务需求,在finally中,还是要调用下默认的处理机制。

至此,java层的异常处理机制就结束了。

三、 Jni层Crash处理。

  1. 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工具。

接下来我们来看具体实现。

  1. jni层crash处理实现。

  1. 以ndk开发的方式引入breakpad,加入编译中进行编译。

  2. 编写jni层接口,并在接口中调用breakpad相关初始化,这里注意,要传入一个crash发生时的处理回调。

此时,若发生crash,DumpCallback将收到回调。我们可以直接在jni层中去做crash的相关处理,也可以将crash继续往上回调,交由java层去处理。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-12-13 12:56:35  更:2021-12-13 12:58:18 
 
开发: 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-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码