崩溃优化 (一):Crash全原理分析与JAVA CRASH监控方案

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

发票列表的各种状态都代表什么?
【全面解析】dinput8.dll文件丢失的详细解决办法都有哪些?快速修复错误