1.崩溃的基本原因是什么?
1.1.抛出异常导致崩溃分析
1.2.AMS如何承接应用的异常信息上报
1.3.对于native_crash系统如何做的处理
1.4.系统如何处理ANR异常数据
1.5.DropBoxManager在Crash方案中扮演的角色
2.Crash处理策略与如何封装库
2.1.崩溃重启方案分析
2.2.崩溃数据采集方案
2.3.异常栈轨迹获取
2.4.使用Looper可以拦截崩溃和ANR.
java_crash 处理
系统崩溃的主要原因
RuntimeInit.java ---> commonInit()----> Thread.setDefaultUncaughtExceptionHandler(new KillApplicationHandler(loggingHandler));
// L171: 杀死进程。
finally {
Process.killProcess(Process.myPid());
System.exit(10);
}
系统的退出,不是由异常引发退出的,而是由Handler主动杀死进程的。
抛出异常导致崩溃分析 [异常信息收集核心点]:
JVM调用---》 Thread中遇到未捕捉异常会由JVM调用dispatchUncaughtException
dispatchUncaughtException 内部调用UncauthExceptionHandler进行处理。
android在app出来时,默认给入一个killApplicationHandler,提供进程退出功能。
代码未捕捉,一路往上抛,是抛到JVM中处理---》
JVM---> dispatch
对于当前文件进行监听。
// 所有出现异常的记录者,不管是java crash,native crash, anr,wtf。
ActivityManagerService-----L9886:addErrorToDropBox()
eventType:
未捕捉异常: crash;
ANR anr;
native_crash.
native_crash 处理
ActivityManagerService----> NativeCrashListener---->
---->
在server进程启动后,开启otherService时,由AMS去启动一个NativeCrashListener;
最终所有的崩溃信息(包括ANR),都处理到/data/system/dropbox下,用文件保存。
AnrHelper.java ---> appNotResponding();
C:
下层在处理时,将异常数据推入到1个文件。
依托于linux,
总结:
Java crash由JVM触发处理----最终走到/data/system/dropbox下,用文件保存;
Native crash由管道通信建立Socket接收通知,----最终走到/data/system/dropbox下,用文件保存;
ANR由多种情况(事件、前后台服务)触发事件,----最终走到/data/system/dropbox下,用文件保存;
最终所有的crash处理, 整个安卓内部都会将对应的数据收集到/data/system/dropbox下。
Crash优化到底做什么
收集信息
有root权限:设备应用比较多,直接采集dropbox下的文件。
无root权限:互联网应用app(依赖权限),去介入到异常处理过程中,
自己写一个KillApplicationHandler替换,异常处理嫁接。
做拦截,在具体的进程被杀之前,进行信息处理和上传。
让用户的体验不那么糟糕。
总结:
1.懂内部原理--->面试这一块
对于crash的处理机制
JAVA 如果没有捕捉异常那么会由JVM调用dispatchUncaughtException调用一个UncaughtExceptionHandler进行处理
默认RuntimeInit给我们提供了一个KillApplicationHandler这个处理会直接退出进程
那么我们自己可以给一个UncaughtExceptionHandler 拦截处理
在起内部,如果不想崩溃,不想退出,用looper重启具体能力
native原理是通过信号量通信上报异常信息
接入到ActivityThread中对所有Activity的生命周期提供异常捕捉能力
2.crash方案
1.找数据上传
2.竟可能让崩溃友好一点
重启
looper 对业务有印象
关闭当前activity
Java Crash由JVM触发处理---最终走到/data/system/dropbox下用文件保存。
Native Crash由管道通信建立socket接收通知---最终走到/data/system/dropbox下用文件保存。
ANR有多种情况(事件、前后台服务)触发处理---最终走到/data/system/dropbox下用文件保存。
最终所有crash处理,整个安卓内部都会将对应的数据收集到/data/system/dropbox下。
NativeCrashListener----
static final String DEBUGGERD_SOCKET_PATH = "/data/system/ndebugsocket";
Crash优化处理:
收集信息
尽可能让用户的体验不那么糟糕。
image.png