Android 崩溃的那些事儿
转载: https://kaiwu.lagou.com/course/courseInfo.htm?courseId=67#/detail/pc?id=1879
总结:
如果要给 crash 日志进行分类,可以分成 2 大类:JVM 异常(Exception)堆栈信息、native 代码崩溃日志。
JVM 异常堆栈信息
Java 中异常(Exception)分两种:检查异常 checked Exception 和非检查异常 unchecked Exception。
所谓检查异常就是在代码编译时期,Android Studio 就会提示代码有错误,无法通过编译,比如 IOException。如果我们没有在代码中将这些异常 catch,而是直接抛出,最终也有可能导致程序崩溃。
非检查异常包括 error 和运行时异常(RuntimeException),AS 并不会在编译时期提示这些异常信息,而是在程序运行时期因为代码错误而直接导致程序崩溃,比如 OOM 或者空指针异常(NPE)。
Java 异常
1.UncaughtExceptionHandler:对于上述两种异常我们都可以使用 UncaughtExceptionHandler 来进行捕获操作,它是 Thread 的一个内部接口。
2.自定义异常处理类:自定义类实现 UncaughtExceptionHandler 接口,并实现 uncaughtException 方法。
native 异常
1.当程序中的 native 代码发生崩溃时,系统会在 /data/tombstones/ 目录下保存一份详细的崩溃日志信息。如果一个 native crash 是必现的,不妨在模拟器上重现 bug,并将 /data/tombstones 中的崩溃日志拉到本地电脑中加以分析。
2.目前比较成熟,使用也比较广泛的就是谷歌的 BreakPad。Breakpad 是一个跨平台的开源库,我们也可以在其 Breakpad Github 上下载自己编译。并通过 JNI 的方式引入到项目中。