Android 使用 CrashHandler 来获取应用的 crash 信息

Android系统稳定性----Crash Crash、FC、froce close 发生场景 应用进程崩溃。强制关闭,android App 因为代码异常导致奔溃。 表现形式主要有两种 1.      Java 代码引起,弹出错误的提示框,JVM虚拟机退出,绝大多数的工具可以捕获。 2.      C++代码引起,没有任何提示,直接回到桌面,所谓的闪退,一般是Linux程序退出,大部分发生在视频,游戏类与底层密切相关的软件上 阅读详情

       在日常开发的过程中应该不可避免的会发生 crash,无论你的程序写的多么完美,都不可能完全避免 crash 的发生,可能是由于 Android 底层的 bug,也可能是由于不充分的机型适配或者是糟糕的网络状况。当 crash 发生时,系统就会kill掉正在执行的程序,现象就是闪退,或者提醒用户程序已经停止运行,这对用户来说是很不友好的,也是我们不愿意看到的,更早的是当用户发生 crash,我们开发者却无法得知程序为何 crash,即便我们想去解决这个 bug,但是由于无法知道用户当时的 crash 信息,所以往往也无能为力,幸运的是,Andorid 提供了处理这类问题的方法,接下来我们就来一起看看到底 Android 给我们提供了什么方法来解决这个棘手的问题


一、Thread 类中的 setDefaultUncaughtExceptionHandler


/** 
 * Sets the default uncaught exception handler. This handler is invoked in 
 * case any Thread dies due to an unhandled exception. 
 * 
 * @param handler 
 *            The handler to set or null. 
 */  
public static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler handler) {  
    Thread.defaultUncaughtHandler = handler;  
} 

       这个方法其实就可以解决我们应用程序的 crash 问题,设置系统默认异常处理器,当系统发生crash 时,系统就会回调 UncaughtExceptionHandler 的 uncaughtException 方法,在 uncaughtException 方法中就可以获取到异常信息,可以选择把异常信息存储下来,存储方式大家可以自己选择,然后在合适的时候通过网络将 crash 信息上传到服务器上,这样我们开发人员就可以分析用户 crash 的场景从而在后面的版本中进行修复,我们还可以在发生 crash 发生时弹出一个对话框,告诉用户程序 crash 了,然后再退出


二、实现自己的异常捕获类


1)建立异常 Handler,命名为 CrashHandler,代码如下

/**
 * 异常捕获类
 * Created by qiudengjiao on 2017/9/29.
 */

public class CrashHandler implements Thread.UncaughtExceptionHandler {

    private static final String TAG = "CrashHandler";
    private static final boolean DEBUG = true;

    private static final String PATH = Environment.getExternalStorageDirectory().getPath() + "/ryg_test/log/";
    private static final String FILE_NAME = "crash";

    //log文件的后缀名
    private static final String FILE_NAME_SUFFIX = ".trace";

    private static CrashHandler sInstance = new CrashHandler();

    //系统默认的异常处理(默认情况下,系统会终止当前的异常程序)
    private Thread.UncaughtExceptionHandler mDefaultCrashHandler;

    private Context mContext;

    //构造方法私有,防止外部构造多个实例
    private CrashHandler() {
    }

    public static CrashHandler getInstance() {
        return sInstance;
    }

    /**
     * 初始化
     *
     * @param context
     */

    public void init(Context context) {
        //获取系统默认的异常处理器
        mDefaultCrashHandler = Thread.getDefaultUncaughtExceptionHandler();
        //将当前实例设为系统默认的异常处理器
        Thread.setDefaultUncaughtExceptionHandler(this);
        //获取Context,方便内部使用
        mContext = context.getApplicationContext();
    }

    /**
     * 这个是最关键的函数,当程序中有未被捕获的异常,系统将会自动调用#uncaughtException方法
     * thread为出现未捕获异常的线程,ex为未捕获的异常,有了这个throwable,我们就可以得到异常信息
     *
     * @param thread
     * @param throwable
     */
    @Override
    public void uncaughtException(Thread thread, Throwable throwable) {
        try {
            //导出异常信息到SD卡中
            dumpExceptionToSDCard(throwable);
            //这里可以通过网络上传异常信息到服务器,便于开发人员分析日志从而解决bug
            uploadExceptionToServer();
        } catch (IOException e) {
            e.printStackTrace();
        }

        //打印出当前调用栈信息
        throwable.printStackTrace();

        //如果系统提供了默认的异常处理器,则交给系统去结束我们的程序,否则就由我们自己结束自己
        if (mDefaultCrashHandler != null) {
            mDefaultCrashHandler.uncaughtException(thread, throwable);
        } else {
            android.os.Process.killProcess(android.os.Process.myPid());
        }
    }

    /**
     * 保存到内存卡
     * 这里我们也可以根据项目需要选择其他的保存方式
     *
     * @param throwable
     * @throws IOException
     */
    private void dumpExceptionToSDCard(Throwable throwable) throws IOException {
        //如果SD卡不存在或无法使用,则无法把异常信息写入SD卡
        if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            if (DEBUG) {
                Log.w(TAG, "sdcard unmounted,skip dump exception");
                return;
            }
        }

        File dir = new File(PATH);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        long current = System.currentTimeMillis();
        String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(current));
        //以当前时间创建log文件
        File file = new File(PATH + FILE_NAME + time + FILE_NAME_SUFFIX);

        try {
            PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file)));
            //导出发生异常的时间
            pw.println(time);

            //导出手机信息
            dumpPhoneInfo(pw);

            pw.println();
            //导出异常的调用栈信息
            throwable.printStackTrace(pw);

            pw.close();
        } catch (Exception e) {
            Log.e(TAG, "dump crash info failed");
        }
    }

    /**
     * 收集设备参数信息
     *
     * @param pw
     * @throws PackageManager.NameNotFoundException
     */
    private void dumpPhoneInfo(PrintWriter pw) throws PackageManager.NameNotFoundException {
        //应用的版本名称和版本号
        PackageManager pm = mContext.getPackageManager();
        PackageInfo pi = pm.getPackageInfo(mContext.getPackageName(), PackageManager.GET_ACTIVITIES);
        pw.print("App Version: ");
        pw.print(pi.versionName);
        pw.print('_');
        pw.println(pi.versionCode);

        //android版本号
        pw.print("OS Version: ");
        pw.print(Build.VERSION.RELEASE);
        pw.print("_");
        pw.println(Build.VERSION.SDK_INT);

        //手机制造商
        pw.print("Vendor: ");
        pw.println(Build.MANUFACTURER);

        //手机型号
        pw.print("Model: ");
        pw.println(Build.MODEL);

        //cpu架构
        pw.print("CPU ABI: ");
        pw.println(Build.CPU_ABI);
    }

    /**
     * 将异常信息上传到服务器
     */
    private void uploadExceptionToServer() {
        //在这里写上传到服务器的逻辑
    }
}

       从上面的代码可以看出,当应用程序崩溃时,CrashHandler 类会将异常信息以及设备信息写入 SD 卡,这里大家也可以根据自己项目需要进行处理,例如也可以存储在数据库中,接着将异常交给系统处理,系统会帮我们中止程序,如果系统没有默认的异常处理机制,那么就自行中止,当然而又可以选择将异常信息上传到服务器,这里我们没有实现这个逻辑,实际开发中都需要将异常信息上传到服务器


三、如何使用 CrashHandler


其实使用 CrashHandler 也非常简单,我们可以在 Application 初始化的时候来设置 CrashHandler,如下所示:


/**
 * 自定义 Application 类
 * Created by qiudengjiao on 2017/9/29.
 */

public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        init();
    }

    private void init() {
        //初始化异常捕获类 CrashHandler
        CrashHandler.getInstance().init(this);
    }
}

       通过上面的操作,我们的程序就能捕获到 crash 了,同时还能从服务器上查看用户的 crash 信息,今天就写到这里,给大家推荐一本不错的书:Android 开发艺术,作者是任玉刚,相信大家也都知道,这本书的内容还是非常不错的,值得大家一看,比较适合有一定 Android 基础的同学,马上就是国庆小长假了,祝大家国庆节愉快


参考:Android 开发艺术



Android Crash之Java Crash分析 本篇先探讨Java Crash,Native Crash我们会在下一篇重点讨论。1. 这类错误一般是由Java层代码触发的2. 一般情况下程序出错时会弹出提示框,JVM虚拟机退出3. 一般的Crash工具都能够捕获,系统也提供了API举个栗子====我们可以看到,button是没有被实例化的,我们调用它的方法就会让程序崩溃,如下图所示:通过Crash堆栈信息定位问题上面就是一个很简单的Crash啦,相信很多同学在开发过程中一定遇到过这种情况,万恶的空指针啊,啊,啊。 阅读详情

相关推荐

AndroidCrashHandler:Android崩溃处理流程

我们写程序的时候都希望能写出一个没有任何Bug的程序,期望在任何情况下都不会发生程序崩溃。但没有一个程序员能保证自己写的程序绝对不会出现异常崩溃。特别是当你用户数达到一定数量级后,你也更容易发现应用不同情况下的崩溃。   对于还没发布的应用程序,我们可以通过测试、分析Log的方法来收集崩溃信息。但对已经发布的程序,我们不可能让用户去查看崩溃信息然后再反馈给开发者。所以,设计一个对于小白用户都可以轻松实现反馈的应用就显得很重要了。我这里结合我自己写的一个Demo,来分析从崩溃开始到崩溃信息反馈到我们服务器,我们程序都需要做什么。 当我们的程序因未捕获的异常而突然终止时,系统会调用处理程序的接口UncaughtExceptionHandler。如果我们想处理未被程序正常捕获的异常,只需实现这个接口里的uncaughtException方法,uncaughtException方法回传了Threa

Android: CrashHandler获取APP的crash信息

当APP发生Crash后虽然无法让其再继续运行,但能直到程序crash的原因,就可以修复错误(比如热修复)。当APP上线后,APP发生了crash,这个crash信息是很难被获取到的。而通过CrahHandler来监视应用的crash信息,给程序设置一个CrashHandler,这样当程序crash的时候就会调用CrahHandler的uncaughtException(),在这个方法中可以获取c...

手写我对你的温柔 2589

用Coze平台30分钟打造《花光10亿》小游戏:零代码AI开发实战

本文详细介绍了如何利用字节跳动推出的Coze平台,在30分钟内零代码开发一款名为《花光10亿》的AI小游戏。通过配置提示词、集成图像生成插件、构建自动化工作流以及使用数据库功能,即使没有编程基础的用户也能快速将创意转化为可交互的智能应用,体验AI开发的便捷与高效。

weixin_29313547的博客 207

Android CrashHandler全局异常

Android 应用不可避免的会发生crash 即崩溃,无论程序写的多好,都会不可避免的发生崩溃,可能是由底层引起的,也有可能是写的代码引起的。当crash发生时,系统会kill掉正在执行的程序,现象是程序闪退或提升用户已停止运行。出现这种情况,开发者却无法得到程序为何crash。Android 提供了处理这类问题的方法。java的Thread中有一个UncaughtExceptionHandler接口,该接口的作用主要是为 了 当 Thread 因未捕获的异常而突然终止时,调用处理程序。

追梦的鱼儿 1450

Stata面板数据OLS回归分析实战指南

OLS回归作为计量经济学的核心分析方法,通过最小化残差平方和实现参数估计,广泛应用于经济学实证研究。其技术价值在于模型简洁、结果易于解释,特别适合处理面板数据中的复杂关系。在实际应用中,配合robust标准误能有效解决异方差问题,而固定效应模型则可控制个体特异性。本文以Stata软件为例,详细演示从数据导入、描述性统计到混合OLS和固定效应模型构建的全流程,重点解析面板数据特有的格式设定、模型选择标准以及结果呈现技巧,为经济学研究者提供可直接复用的分析框架。

weixin_29051811的博客 268

【LabVIEW懒人系列教程-视觉入门】2.6LabVIEW模板匹配之创建模板

上期2.5在Labview软件框架中实现了模板匹配功能的运用,然而我们的模板图像是通过视觉助手创建出来的,在实际项目中这样做 ,难免有些不妥。所以,今天就给大家讲解一下,如何编写创建模板功能,模板图像的创建与加载需要注意一些什么。 模板图片的创建,大家可以理解为将图像中的一个特征区域扣下来,通过Labview函数进行信息学习,然后保存成带有图像信息的模板图。 具体做法,下面为大家演示一下 百度网盘视频链接:https://pan.baidu.com/s/1-zxcJBxPgk4t1Ej..

视觉龙哥 2167

Android - CrashHandler 全局异常捕获器

用于线程因未捕获异常而突然终止时调用的处理程序接口。当线程由于未捕获异常而即将终止时,Java虚拟机将使用thread . getuncaughtexceptionhandler()查询该线程的UncaughtExceptionHandler,并调用该处理程序的uncaughtException方法,将线程和异常作为参数传递。如果一个线程没有显式设置它的UncaughtExceptionHandler,那么它的ThreadGroup对象充当它的UncaughtExceptionHandler。

感觉不怎么会的博客 2117

免费升级哨兵2号分辨率!用SRCNN深度学习模型实现10米→2.5米超分重建

本文详细介绍了如何利用SRCNN深度学习模型,将哨兵2号遥感影像的分辨率从10米免费提升至2.5米。文章提供了从数据准备、模型训练到部署应用的全流程实战指南,旨在通过AI应用技术,为农业监测、城市规划等领域提供更高精度的影像数据支持。

coffee的博客 523

CrashHandler全局异常捕获

应用在日常的开发中,我们经常需要去Logcat测试我们的App,但由于很多原因,Android Monitor会闪屏或者Crash信息丢失。 这个时候就需要一个CrashHandler来将Crash写入到本地方便我们随时随地查看 安卓已经帮我们想好了解决问题的接口(UncaughtExceptionHandler)。从名称上就知道这是用来处理没有捕捉到的野生Exception的。平时我们try catch的Exception的那就叫捕捉到的。看一下UncaughtExceptionHandler的源码:

Restless Breeze 2615

Camunda 7.x 系列【22】全局监听器

Camunda支持义一个全局ExecutionListener和一个全局TaskListener,会捕获流程中发生的所有事件的通知,这样可以定义一个全局的审批人检查监听器,作用于所有用户任务。

记录知识、锤炼自我 2942

人工智能混合编程实践:C++调用封装好的DLL进行异常检测推理

C++、Python、ONNX、人工智能、异常检测、Anomalib 2.1.0

FriendshipTang的博客 170

1- CrashHandler 知识点的使用

1- CrashHandler 知识点的使用 在Android中我们经常遇到错误,根据不同的机型,不同的网络情况,在我们的产品上线之后, 用户在不同的环境中可能会产生不同的bug,但是这些bug是我们在上现在之前的测试环节没有测试出来的隐形bug;而此时我们开发人员没有办法获取bug的log日志进行分析,就比较麻烦;此时我们就需要借助 CrashHandler捕获全局异常并且进行处理,将日志发送我们的服务器了; java的Thread中有一个UncaughtExceptionHandler接口,该接口

bobo_zai的博客 1687

修改 Alist 密码时报错?看看这个坑怎么解决!

启动服务后,再修改密码”。以后再遇到类似问题,先检查服务是否正常运行,说不定就能少踩不少坑。如果还有其他 Alist 的问题,欢迎在评论区留言交流~

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1154

Android 使用CrashHandler获取应用的crash信息

android应用不可避免地会发生crash,也称之为崩溃,无论程序写的多完美,总是无法避免crash的发生,可能是由于android系统底层的bug,也可能是由于不充分的机型适配或者是糟糕的网络状况。当crash发生时,系统会kill掉正在执行的程序,现象就是闪退或者提示用户程序已经停止运行,这对用户来说是很不友好的,也是开发者不愿意看到的。更糟糕的是,当用户发生了crash,开发者却无法得知程

再简单的事,也要用心做成! 6401

uniapp - H5网页打包运行报错Failed to load resource: net::ERR_FILE_NOT_FOUND(uniApp打包成H5部署到服务器,打包h5白屏并报错页面空白)

Failed to load resource: net::ERR_FILE_NOT_FOUND,uniapp 坑之打包之后白屏,uniapp打包h5,HBuilderX 打包H5后空白报错 Failed to load resource: net::ERR FILE NOT_FOUND,UNI-APP H5应用白屏(空白页)解决方案,白屏并报错Failed to load resource: net::ERR_FILE_NOT_FOUND,uniapp开发,打包成H5部署到服务器,uniapp打包之后首页

🏆 前端领域优质创作者 3579

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

crashdumpandroid_Android使用CrashHandler来获取应用的crash信息的方法

在日常开发的过程中应该不可避免的会发生 crash,无论你的程序写的多么完美,都不可能完全避免 crash 的发生,可能是由于 Android 底层的 bug,也可能是由于不充分的机型适配或者是糟糕的网络状况。当 crash 发生时,系统就会kill掉正在执行的程序,现象就是闪退,或者提醒用户程序已经停止运行,这对用户来说是很不友好的,也是我们不愿意看到的,更早的是当用户发生 crash,我们开发...

weixin_39848347的博客 217

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

使用CrashHandler来获取应用的Crash信息

在我们的实际开发中,我们都避免不了遇到我们程序crash直接崩掉的情况,这对用户来说是很不友好的 ,当然也是我们开发者不想看到的。所以我们希望当我们的程序发生异常crash的时候,我们能够得治用户的crash信息,我们也可以在程序crash的时候弹出一个对话框告诉用户程序crash了。然后再退出,这样比闪退会好一些。 在安卓中我们可以利用CrashHandler来监视我们应用的crash信息

安东尼的博客 2552

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

使用CrashHandler获取crash信息

1、背景和问题在项目开发时,程序crash是再常见不过的情况。crash发生时系统会杀掉正在执行的程序,显示为闪退或者是提示用户程序已经停止运行。而且,用户使用过程中发生的crash,我们开发者 是无法得知原因的,无法知道crash的原因,也就无法解决这个问题。2、解决方法在Android中提供了处理之类的方法,在Thread类中的一个方法setDefaultUncaughtExceptionHan

一个写代码的胖子的博客 1720

使用CrashHandler来获取应用的oom crash信息

Android应用开发中不可避免地会发生崩溃,特别是在用户使用过程中,一些特定场景的偶然概率的crash会通常让开发者抓狂。幸运的是Android提供了处理这类问题的方法,当App Crash时,我们可以记录下Crash的原因或者是一些设备信息,并上传到服务器供开发者分析,以便开发者迅速定位问题原因。 实现这个功能我们需要实现Thread.UncaughtExceptionHandler这个接口。

寒江蓑笠的专栏 1697

通过CrashHandler获取应用的crash信息

注:本文为《Android开发艺术探索》的读书笔记 出现的原因 再完美的程序都会crash。当crash(崩溃)发生时,系统会kill掉正在执行的程序,UI上反馈的信息就是提示用户程序已停止运行,无论对于用户和开发者,都是不愿意看到的。 即使用户的app发生了crash,对于开发者而言,也无法得知当时产生的原因。 解决办法Android提供了处理这类问题的方法,可以设置系统的默认异常处理器:

wudongjiang333的博客 679

使用CrashHandler来获取应用的crash信息

使用CrashHandler来获取应用的crash信息 实现Thread.UncaughtExceptionHandler,在uncaughtException()方法中获取异常信息并将其储存到SD卡或者上传到服务器,然后调用Thread的setDefaultUncaughtExceptionHandler()方法将它设置成线程默认的异常处理器

备忘录 691

Android Crash 监控

Crash(应用崩溃)是由于代码异常而导致 App 非正常退出,导致应用程序无法继续使用,所有工作都停止的现象。发生 Crash 后需要重新启动应用(有些情况会自动重启),而且不管应用在开发阶段做得多么优秀,也无法避免 Crash 发生,特别是在 Android 系统中,系统碎片化严重、各 ROM 之间的差异,使 Android 在稳定性方面需要付出更多的代价。 在应用中发生 Crash 具有以下...

Lud的博客 2378

android 程序崩溃信息的收集【使用CrashHandler来收集应用的crash信息】

1.什么是crashandroid应用程序不可避免的会发生crash,也称之为崩溃,表现形式为闪退或是程序已停止运行。2.发生crash的原因发生crash的原因有很多: 程序本身bug android系统底层bug 机型不适配或是网络状况糟糕 3.使用CrashHandler来获取应用的crash,保存于本地或是上传于服务器 crash代码块 package com.example.demo3;i

qq_26585943的博客 1218

Android 使用UncaughtExceptionHandler捕捉应用的crash信息

Android 使用UncaughtExceptionHandler捕捉应用的crash信息

weixin_42602900的博客 1131

android crash存储位置,在Android手机上保存Crash Log

定义CrashLog文件:如果有存储器,则将文件保存在存储器下。否则保存在data目录下。存储器不一定是SD卡,也可能是mount出来的一块存储空间(不是内存)。比如,小米3就没有SD卡。publicclassCrashLog{privatestaticContextmContext;publicstaticfinalStringDIR_FOR_APP="myApp";pu...

weixin_31674039的博客 2832
上一篇: Android 使用 Multidex 解决 65536 方法数越界问题
下一篇: Java 常用查找算法
QDJdeveloper
博客等级 码龄11年 108粉丝 49原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值