一、事务所档案:稳定性案件概述
在 Android 城市中,系统稳定性侦探事务所负责处理两类最常见的案件:超时(Timeout)和崩溃(Crash)。这些案件会导致城市出现死机重启、冻屏黑屏、应用闪退等 "治安问题"。事务所将案件分为两大部门:
- 超时案件部:处理 "任务超时未完成" 类案件
- 崩溃案件部:处理 "系统异常崩溃" 类案件
案件分类表
案件类型 | 常见表现 | 调查重点 |
---|---|---|
超时 (Timeout) | 应用无响应 (ANR)、系统卡顿 | 任务执行时间、资源锁竞争 |
崩溃 (Crash) | 应用闪退、系统重启 | 异常堆栈、信号类型、硬件状态 |
二、超时案件部:迟到的任务警报
1. ANR 案件:任务超时未完成
案件定义
在 Android 城市中,每个任务都有严格的限时规定,超时未完成就会触发 ANR (Application Not Responding) 警报,就像侦探事务所的 "超时任务警报器"。
java
arduino
// ANR任务限时规定(简化版)
public class ANRTimeoutRules {
// 前台服务必须在20秒内完成
public static final long FOREGROUND_SERVICE_TIMEOUT = 20 * 1000; // 20s
// 前台广播必须在10秒内完成
public static final long FOREGROUND_BROADCAST_TIMEOUT = 10 * 1000; // 10s
// 输入事件分发必须在5秒内完成
public static final long INPUT_DISPATCH_TIMEOUT = 5 * 1000; // 5s
// 检查任务是否超时
public boolean isTaskTimeout(long startTime, long timeout) {
return System.currentTimeMillis() - startTime > timeout;
}
}
案件实例:广播超时案
某广播任务在前台执行时超过 10 秒未完成,触发 ANR 警报:
plaintext
yaml
------ ANR in com.example.app ------
Reason: Broadcast timeout (background BroadcastRecord{...} took 15.3s)
Load: 1.23, 1.45, 1.67
CPU usage from 0s to 15300ms later:
12% system_server: 8% user + 4% kernel
8% com.example.app: 6% user + 2% kernel
...
特殊情况:SNR 案件
当 system 进程发生超时,会触发 SNR (System Not Responding) 案件,这是更严重的系统级超时,就像城市主干道堵塞。虽然技术上有 ANR/SNR 之分,但事务所通常统一称为 ANR 案件处理。
2. WatchDog 巡逻队:系统的实时监控
WatchDog 就像城市中的巡逻队,持续监控系统状态,发现异常及时报告:
c++
scss
// WatchDog巡逻队核心逻辑(简化版)
void* watchdog_thread(void* arg) {
while (1) {
// 检查system进程状态
check_system_process();
// 检查GC操作是否超时
check_gc_operation();
// 检查dex2oat编译是否卡住
check_dex2oat();
// 每隔一段时间巡逻一次
sleep(500); // 500ms巡逻一次
}
}
// 检查system进程状态
void check_system_process() {
// 检查关键服务是否响应
if (!is_service_responsive("activity")) {
report_timeout("ActivityManager not responsive");
}
// ...其他服务检查
}
特殊巡逻队:FinalizerWatchDogDaemon
每个应用进程都有自己的 "垃圾清理巡逻队",监控垃圾回收过程:
- 当 FinalizerDaemon 回收对象时间过长,触发警报
- 就像清洁工清理垃圾超过预定时间,巡逻队会报告异常
3. 案件证据收集:超时现场取证
当 ANR 或 WatchDog 警报触发后,事务所会立即启动证据收集:
bash
ini
# Java进程取证命令(发送SIGQUIT信号)
kill -3 [pid] # 相当于给Java进程侦探"发信号",要求提交任务报告
# Native进程取证命令(debuggerd工具)
debuggerd -b [pid] # 专业取证人员介入,全面分析Native进程现场
证据收集流程:
- 清空旧的案件记录 (/data/anr/traces.txt)
- 记录当前所有进程的任务执行状态
- 将关键证据保存到 DropBox(类似案件归档系统)
- 生成详细的案件报告,供侦探分析
三、崩溃案件部:突发异常事件
1. Java 层崩溃:未解决的线索异常
Java 层崩溃就像侦探在调查中遇到无法解决的线索(未捕获异常):
java
typescript
// Java崩溃处理流程(简化版)
public class JavaCrashHandler implements Thread.UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread t, Throwable e) {
// 记录崩溃线索(堆栈信息)
logStackTrace(e);
// 保存线索到临时档案
saveToCrashFile(e);
// 通知系统崩溃事件
notifyCrashEvent();
// 尝试恢复或重启应用
tryToRecover();
}
// 记录堆栈信息
private void logStackTrace(Throwable e) {
Log.e("Crash", "Uncaught exception", e);
}
}
案件实例:空指针异常
plaintext
yaml
FATAL EXCEPTION: main
Process: com.example.app, PID: 1234
java.lang.NullPointerException: Attempt to invoke virtual method 'void com.example.Data.load()' on a null object reference
at com.example.MainActivity.onCreate(MainActivity.java:45)
at android.app.Activity.performCreate(Activity.java:6237)
...
2. Native 层崩溃:危险信号事件
Native 层崩溃类似侦探遇到突发危险信号(signal):
c
运行
scss
// Native崩溃处理流程(简化版)
void signal_handler(int signal, siginfo_t* info, void* context) {
// 收到危险信号(如段错误SIGSEGV)
switch (signal) {
case SIGSEGV:
log_message("Segmentation fault at address: %p", info->si_addr);
break;
case SIGBUS:
log_message("Bus error");
break;
// ...其他信号处理
}
// 通过socket通知debuggerd取证
send_crash_notification(signal, info);
// 保存现场证据(内存、寄存器状态)
save_crash_context(context);
// 进程终止或重启
process_terminate();
}
案件实例:段错误崩溃
plaintext
yaml
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'google/nexus5/hammerhead:6.0.1/MMB29K/123456:user/release-keys'
pid: 1234, tid: 1235, name: com.example.app >>> com.example.app <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0
r0 00000000 r1 00000000 r2 00000000 r3 00000000
...
backtrace:
#00 pc 00001234 /system/lib/libc.so (malloc+123)
#01 pc 00005678 com.example.app (com.example.NativeLib.crashNative+45)
3. Kernel 层崩溃:城市基础设施故障
Kernel 层崩溃类似城市基础设施(如道路、水电)出现严重故障:
c
运行
scss
// Kernel崩溃处理(简化版)
void kernel_panic(const char *fmt, ...) {
// 记录内核崩溃信息
printk(KERN_EMERG "Kernel panic: %s\n", fmt);
// 输出寄存器和内存状态
print_registers();
print_memory_state();
// 触发内核Oops或 panic
if (panic_on_oops) {
do_kernel_oops();
} else {
// 尝试恢复或重启系统
system_reboot(0);
}
}
案件特点:
-
通常与硬件驱动、CPU 问题相关
-
错误信息可能包含 "Kernel panic"、"Oops" 等
-
调查需要硬件级别的专业知识,如:
plaintext
ini
[ 1.234567] Kernel panic - not syncing: Fatal exception in interrupt
[ 1.234570] CPU: 0 PID: 123 Comm: system_server Not tainted 3.4.0 #1
[ 1.234572] Hardware name: Qualcomm MSM8974
[ 1.234575] Workqueue: events watchdog_work
[ 1.234577] task: ffff000012345678 ti: ffff000087654320 task.ti: ffff000087654320
...
四、案件调查总结:稳定性侦探的核心能力
1. 超时案件调查要点:
- 检查任务执行时间是否超过阈值
- 分析资源锁竞争情况(如 Binder 死锁)
- 查看 WatchDog 报告的异常点
- 重点关注 ANR 时的 CPU 负载和进程状态
2. 崩溃案件调查要点:
- Java 崩溃:分析异常类型和堆栈轨迹
- Native 崩溃:识别 signal 类型和错误地址
- Kernel 崩溃:结合硬件信息和驱动日志
- 所有崩溃:对比系统版本、硬件型号等环境因素
3. 常用调查工具:
-
bugreport
:获取系统全面状态报告 -
logcat
:查看系统日志线索 -
strace
:跟踪系统调用 -
ltrace
:跟踪库函数调用 -
专业工具:ChkBugReport(可视化分析)
通过这套完整的案件处理流程,Android 系统稳定性侦探事务所能够高效识别和解决各类稳定性问题,确保 Android 城市的正常运转。每个开发者都可以成为事务所的 "兼职侦探",通过理解这些机制,快速定位和解决应用中的稳定性问题。