Android自定义全局异常捕获

概述

大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象,开发者个人不可能购买所有设备逐个调试,所以在程序发布出去之后,如果出现了崩溃现象,开发者应该及时获取在该设备上导致崩溃的信息,这对于下一个版本的bug修复帮助极大,所以今天就来介绍一下如何在程序崩溃的情况下收集相关的设备参数信息和具体的异常信息,并发送这些信息到服务器供开发者分析和调试程序。

在MainActivity.java代码中,代码是这样写的:

我们在这里故意制造了一个潜在的运行期异常,当我们运行程序时就会出现以下界面:

app_crash_dialog

遇到软件没有捕获的异常之后,系统会弹出这个默认的强制关闭对话框。

我们当然不希望用户看到这种现象,简直是对用户心灵上的打击,而且对我们的bug的修复也是毫无帮助的。我们需要的是软件有一个全局的异常捕获器,当出现一个我们没有发现的异常时,捕获这个异常,并且将异常信息记录下来,上传到服务器公开发这分析出现异常的具体原因。

接下来我们就来实现这一机制,不过首先我们还是来了解以下两个类:android.app.Application和java.lang.Thread.UncaughtExceptionHandler。Application:用来管理应用程序的全局状态。在应用程序启动时Application会首先创建,然后才会根据情况(Intent)来启动相应的Activity和Service。本示例中将在自定义加强版的Application中注册未捕获异常处理器。

有关java.lang.Thread.UncaughtExceptionHandler更多介绍请参考上一篇文章Java 多线程对于异常的处理

完成这个CrashHandler后,我们需要在一个Application环境中让其运行,为此,我们继承android.app.Application,添加自己的代码,MyApplication.java代码如下:

最后,为了让我们的CrashApplication取代android.app.Application的地位,在我们的代码中生效,我们需要修改AndroidManifest.xml中name为android:name=”com.sunny.demo.MyApplication”

app_crash_toast

看以看到,并不会有强制关闭的对话框出现了,取而代之的是我们比较有好的提示信息。

异常时写入文件,下面是data/data中生成的文件:

crash_file

用文本编辑器打开日志文件,看一段日志信息:

本文转载自 Android自定义捕获Application全局异常 Android自定义捕获Application全局异常优化版 。事实上是两篇博客的结合体,一篇中的文字描述加上另一篇中的代码。

One comment

发表评论