XCrash.init:
初始化执行该方法 该方法主要完成anrHandler javaCrashHandler AnrHandler nativeHandler的初始化工作
javaCrashHandler初始化:将当前对象设置为未捕获异常处理器,后续crash在此处处理
nativeHandler初始化:java层只执行loadSo操作 接着调用nativeInit(这是个native方法)函数执行native层的初始化工作。native层最终调用到xc_jni_init 函数,该初始化函数 又分为三个部分:xc_common_init (初始化公共参数) xc_crash_init(启动native线程,待到crash发生 jni调用上层callback函数替换函数处理栈,注册信号监听) xc_trace_init(注册anr信号监听 启动native线程 在发生crash anr需要dump堆栈时 由该线程收集相关堆栈 并进行dump,)。
java crash监听
发生crash,系统会回调执行uncaughtException,接着执行handleException方法处理异常,主要是dump信息,收集异常信息(前后台状态 崩溃时间 线程信息 内存信息 网络状态 logcat 其他线程信息,唤醒native线程dump trace信息)
native crash监听
监听到crash 挂起所有线程 获取进程信息 恢复所有线程
anr监听
启动初始化注册quit信号监听 监听到quit信号 则dump trace
4.anr的原理
分类:anr按类型分类两种 input anr 和others(service broadcast contentprovider)
input anr:
service类型anr暂不概述,简单来说就是埋雷式anr 启动service时post一个定时消息 一定事件 一段事件后如果该消息还没被移除 则触发anr 对了 service启动完成后该消息会被移除