1. Timeout (ANR)
对于Android系统来说,比较常见的便是Service, Broadcast, provider以及input, 当普通app进程超过一定时间没有执行完, 则会弹出应用无响应(Application Not Responding, ANR)的对话框. 如果该app运行在system进程, 更准确的来说,应该是(System Not Responding, SNR). 虽然有ANR和SNR之分, 但习惯上大家都统称为ANR问题.
理解Android ANR的触发原理, 对于组件ANR问题, 有些是需要的执行时间比较长, 即便触发ANR, 只要再多给些时间还是可以正常运行的; 有些则是由于发生了死锁,即便给再长的时间都无法恢复的问题.
Service Timeout:比如前台服务在20s内未执行完成;
broadcast Timeout:比如前台广播在10s内未执行完成
// How long we allow a receiver to run before giving up on it.
static final int BROADCAST_TIMEOUT = 10*1000;
ContentProvider Timeout:内容提供者执行
InputDispatching Timeout: 输入事件分发超时5s,包括按键和触摸事件。
// How long we wait until we timeout on key dispatching.
static final int KEY_DISPATCHING_TIMEOUT = 5*1000;
无响应界面
ActivityManagerService.java
SHOW_UID_ERROR_MSG mShowDialogs
2. WatchDog
还有另一个类型那就是WatchDog.WatchDog工作原理, 最为常见的便是运行在system进程中的”watchdog”线程;
还有运行在各个app进程(包括system进程)的”FinalizerWatchdogDaemon”,该线程用于监控执行GC的过程中, 守护线程”FinalizerDaemon”回收某个对象时间过长的监视器;
还有dex2oat, wifi等watchdog.
当发生ANR或WatchDog后, 便需要收集系统相关信息,用于分析和修复异常, 见理解Android ANR的信息收集过程. 整个过程中进程Trace的输出是最为核心的环节,另外该过程会清空/data/anr/traces.txt的老文件, 那么原来之前的traces信息一般地会先输出到dropbox
对于Java层Crash, 理解Java Crash处理流程, 往往是抛出了一个未捕获的异常uncaughtException而导致的崩溃. 那是不是把所有的异常都catch住系统就没有问题呢, 这个是要分情况的,有时候的异常强制崩溃可能会留下更大的问题, 有些异常的抛出是需要深入分析Root Cause,从根源来解决问题, 而非简单粗糙的捕获住所有的异常