目录
前言
每一个Android开发同学在项目开发过程中肯定都遇到过各式各样的Crash问题,大家都非常不希望程序发生Crash。那么问题来了,你真的了解Crash吗?
Android为什么会发生Crash
最近在思考一个问题,为什么Android程序发生空指针等异常时,会导致应用会崩溃,进程结束。而java web程序发生这些异常,只要有其他线程还在运行,虚拟机就不会关闭,进程也不会结束
我在App中模拟了一个数组越界异常,Android系统会帮我们打印异常日志
主线程异常
子线程异常
每当异常发生的时候,我们往往都会通过查看日志来解决。那么我们是不是可以通过查看打印异常日志的代码,来找到Android系统是如何抛出这些未捕获的异常,以及Android在出现未捕获异常的时候为什么会发生Crash
我们找到了com.android.internal.os.RuntimeInit
类,这里我们仅贴出我们需要的代码
public class RuntimeInit {
final static String TAG = "AndroidRuntime";
....
private static class LoggingHandler implements Thread.UncaughtExceptionHandler {
public volatile boolean mTriggered = false;
@Override
public void uncaughtException(Thread t, Throwable e) {
mTriggered = true;
if (mCrashing) return;
//打印异常日志
if (mApplicationObject == null && (Process.SYSTEM_UID == Process.myUid())) {
Clog_e(TAG, "*** FATAL EXCEPTION IN SYSTEM PROCESS: " + t.getName(), e);
} else {
StringBuilder message = new StringBuilder();
message.append("FATAL EXCEPTION: ").append(t.getName()).append("\n");
final String processName = ActivityThread.currentProcessName();
if (processName != null) {
message.append("Process: ").append(processName).append(", ");
}
message.append("PID: ").append(Process.myPid());
Clog_e(TAG, message.toString(), e);
}
}
}
private static class KillApplicationHandler implements Thread.UncaughtExceptionHandler {
private final LoggingHandler mLoggingHandler;
public KillApplicationHandler(LoggingHandler loggingHandler) {
this.mLoggingHandler = Objects