Android Crash日志收集

这里主要针对手机发货后,到达用户手上之后,如何搜集故障现场信息。其实开发APP时,已经有一些第三方的Crash SDK可以选择,比如腾讯的Bugly、百度的MTJ、友盟SDK等。这里主要是介绍如何实现这个功能的内部原理。

要实现一个Crash SDK包括三个方面:Crash捕获、Crash堆栈信息的获取、Crash日志的上报。

Java层Crash捕获机制

1)基本原理

Android应用程序是基于Java语言开发的,异常处理也是沿用Java语言的机制。在java中异常分为两类:CheckedException和UnCheckedException。CheckedException又称为编译时异常,它是编译阶段必须处理的,否则编译失败(这部分异常是类的静态定义中明确写明的),一般使用try..catch..捕获并进行处理。UnCheckedException又称为运行时异常,这类异常只有在程序运行时满足条件才会触发。当然,也可以使用try..catch...来捕获这类异常,但事实是我们往往不知道在什么地方应该添加对这类异常的捕获。

好在java提供了一个全局异常捕获处理器,Android应用在java层捕获Crash依赖的就是Thread.UncaughtExceptionHandler处理器接口,通常情况下,我们只需要实现这个接口,并重写其中的uncaughtException方法,在该方法中可以读取Crash的堆栈信息(即Throwable类的printStackTrace方法)。一般都是在Application类的onCreate方法中调用Thread.setDefaultUncaughtExceptionHandler方法来替换应用默认的异常处理器。

2)其他信息

除了堆栈信息之外,我们可以调用Thread的一些方法获取线程信息、调用SharedPreference获取一些开关设置、系统设置、自定义存储的一些log、Meminfo信息等。

Native层的Crash捕获机制

Native层发生异常后并没有java这样明确的机制,而是通过进程间信号处理机制来完成。可以可以监控进程的SIGFPE、SIGSEGV、SIGABRT、SIGILL、SIGBUG、SIGIPE、SIGSTKFLT等信号,实现自定义的信号处理函数。在这里可以向java发送消息,启动java的Logcat抓取工作(因为Native的异常一般在Logcat中会有所反应)。

还有一个Google Breakpad跨平台的崩溃转储和分析工具可以使用,通过集成它提供的函数库,在应用发生崩溃时,可以将相关堆栈信息写入一个minidump格式文件中,开发人员可以通过addr2line等工具将dump文件中的函数地址转换成对应的代码行数,从而知道问题发生的具体位置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值