基于Android 6.0的源码剖析, 分析Android应用Crash是如何处理的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/frameworks/base/core/java/com/android/internal/os/RuntimeInit.java /frameworks/base/core/java/android/app/ActivityManagerNative.java (含内部类AMP) /frameworks/base/core/java/android/app/ApplicationErrorReport.java /frameworks/base/services/core/java/com/android/server/ - am/ActivityManagerService.java - am/ProcessRecord.java - am/ActivityRecord.java - am/ActivityStackSupervisor.java - am/ActivityStack.java - am/ActivityRecord.java - am/BroadcastQueue.java - wm/WindowManagerService.java /libcore/libart/src/main/java/java/lang/Thread.java |
一、概述
App crash(全称Application crash), 对于Crash可分为native crash和framework crash(包含app crash在内),对于crash相信很多app开发者都会遇到,那么上层什么时候会出现crash呢,系统又是如何处理crash的呢。例如,在app大家经常使用try...catch
语句,那么如果没有有效catch exception,就是导致应用crash,发生没有catch exception,系统便会来进行捕获,并进入crash流程。如果你是从事Android系统开发或者架构相关工作,或者遇到需要解系统性的疑难杂症,那么很有必要了解系统Crash处理流程,知其然还需知其所以然;如果你仅仅是App初级开发,可能本文并非很适合阅读,整个系统流程错中复杂。
在Android系统启动系列文章,已讲述过上层应用都是由Zygote fork孵化而来,分为system_server系统进程和各种应用进程,在这些进程创建之初会设置未捕获异常的处理器,当系统抛出未捕获的异常时,最终都交给异常处理器。
- 对于system_server进程:文章Android系统启动-SystemServer上篇,system_server启动过程中由RuntimeInit.java的
commonInit
方法设置UncaughtHandler,用于处理未捕获异常; - 对于普通应用进程:文章理解Android进程创建流程 ,进程创建过程中,同样会调用RuntimeInit.java的
commonInit
方法设置UncaughtHandler。
1.1 crash调用链
crash流程的方法调用关系来结尾:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
AMP.handleApplicationCrash AMS.handleApplicationCrash AMS.findAppProcess AMS.handleApplicationCrashInner AMS.addErrorToDropBox AMS.crashApplication AMS.makeAppCrashingLocked AMS.startAppProblemLocked ProcessRecord.stopFreezingAllLocked ActivityRecord.stopFreezingScreenLocked WMS.stopFreezingScreenLocked WMS.stopFreezingDisplayLocked AMS.handleAppCrashLocked mUiHandler.sendMessage(SHOW_ERROR_MSG) Process.killProcess(Process.myPid()); System.exit(10); |
接下来说说这个过程。
二、Crash处理流程
那么接下来以commonInit()方法为起点来展开说明。
1. RuntimeInit.commonInit
1 2 3 4 5 6 7 8 |
public class RuntimeInit { ... private static final void commonInit() { //设置默认的未捕获异常处理器,UncaughtHandler实例化过程【见小节2】 Thread.setDefaultUncaughtExceptionHandler(new UncaughtHandler()); ... } } |
setDefaultUncaughtExceptionHandler()只是将异常处理器handler对象赋给Thread成员变量,即Thread.defaultUncaughtHandler = new UncaughtHandler()
。接下来看看UncaughtHandler对象实例化过程。
2. UncaughtHandler
[–>RuntimeInit.java]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 n-num" data-line="crayon-581284944c56a517000644-29">29 30 31 32 33
一、概述App crash(全称Application crash), 对于Crash可分为native crash和framework crash(包含app crash在内),对于crash相信很多app开发者都会遇到,那么上层什么时候会出现crash呢,系统又是如何处理crash的呢。例如,在app大家经常使用 在Android系统启动系列文章,已讲述过上层应用都是由Zygote fork孵化而来,分为system_server系统进程和各种应用进程,在这些进程创建之初会设置未捕获异常的处理器,当系统抛出未捕获的异常时,最终都交给异常处理器。
1.1 crash调用链crash流程的方法调用关系来结尾:
接下来说说这个过程。 二、Crash处理流程那么接下来以commonInit()方法为起点来展开说明。 1. RuntimeInit.commonInit
setDefaultUncaughtExceptionHandler()只是将异常处理器handler对象赋给Thread成员变量,即 2. UncaughtHandler[–>RuntimeInit.java]
|