第十板块:Android 系统稳定性与调试 | 第二十六篇:Systrace 与 Perfetto 的系统级性能分析
所属板块:第十板块 --- Android 系统稳定性与调试
前置知识:第二十五篇中的 Watchdog/ANR 机制、Linux 内核 Ftrace、Binder IPC 驱动、CPU 调度器(CFS/H-EAS)、图形渲染流水线(SurfaceFlinger)
本篇定位 :这是 Android 性能优化的天眼系统 。如果说 Watchdog 是事后诸葛亮,那么 Systrace/Perfetto 就是实时心电图 。本篇将彻底拆解 Systrace 的数据采集架构(Ftrace + Atrace) 、Perfetto 的下一代架构(Probes + Trace Processor) 、CPU 调度与频率(Freq)的关联分析 、Binder 阻塞的火焰图定位 、UI 卡顿的 VSYNC 偏移分析 。我们将深入 Kernel Tracing 、Userspace Daemon 与 Web-based UI,揭示如何用一张时间轴图表定位毫秒级的性能瓶颈。全程无工具使用教程、无"如何优化"指南,仅保留性能分析的底层定义与系统级推理逻辑。
1. 核心结论先行(Thesis Statement)
Android 的性能分析是一个基于事件的时间轴重构过程。
- Systrace 的本质 :内核事件的快照机 。它利用 Linux 内核的 Ftrace 机制,抓取系统级事件(调度、中断、锁),并结合 Android Framework 的 Atrace 插桩,将 Java/C++ 代码执行与内核调度关联。
- Perfetto 的本质 :下一代全量采集器 。它取代了 Systrace,支持长时间(小时级) 、全量(System-wide) 的数据采集,并内置 Trace Processor 进行 SQL 查询和聚合分析。
- Trace 的本质 :时间戳序列(Timestamp Sequence) 。所有的性能问题最终都表现为 时间轴上的异常:间隔过长(卡顿)、密度过高(功耗)、顺序错误(死锁)。
- 分析的本质 :因果推断。从"果"(UI 掉帧、响应慢)在时间轴上反向追溯"因"(CPU 被抢占、Binder 阻塞、IO 延迟)。
2. 性能分析架构全景图
2.1 从硬件事件到可视化图表
#mermaid-svg-DoYgk915DbYlV8Ie{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-DoYgk915DbYlV8Ie .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-DoYgk915DbYlV8Ie .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-DoYgk915DbYlV8Ie .error-icon{fill:#552222;}#mermaid-svg-DoYgk915DbYlV8Ie .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DoYgk915DbYlV8Ie .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-DoYgk915DbYlV8Ie .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DoYgk915DbYlV8Ie .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DoYgk915DbYlV8Ie .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-DoYgk915DbYlV8Ie .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DoYgk915DbYlV8Ie .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DoYgk915DbYlV8Ie .marker{fill:#333333;stroke:#333333;}#mermaid-svg-DoYgk915DbYlV8Ie .marker.cross{stroke:#333333;}#mermaid-svg-DoYgk915DbYlV8Ie svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DoYgk915DbYlV8Ie p{margin:0;}#mermaid-svg-DoYgk915DbYlV8Ie .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-DoYgk915DbYlV8Ie .cluster-label text{fill:#333;}#mermaid-svg-DoYgk915DbYlV8Ie .cluster-label span{color:#333;}#mermaid-svg-DoYgk915DbYlV8Ie .cluster-label span p{background-color:transparent;}#mermaid-svg-DoYgk915DbYlV8Ie .label text,#mermaid-svg-DoYgk915DbYlV8Ie span{fill:#333;color:#333;}#mermaid-svg-DoYgk915DbYlV8Ie .node rect,#mermaid-svg-DoYgk915DbYlV8Ie .node circle,#mermaid-svg-DoYgk915DbYlV8Ie .node ellipse,#mermaid-svg-DoYgk915DbYlV8Ie .node polygon,#mermaid-svg-DoYgk915DbYlV8Ie .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-DoYgk915DbYlV8Ie .rough-node .label text,#mermaid-svg-DoYgk915DbYlV8Ie .node .label text,#mermaid-svg-DoYgk915DbYlV8Ie .image-shape .label,#mermaid-svg-DoYgk915DbYlV8Ie .icon-shape .label{text-anchor:middle;}#mermaid-svg-DoYgk915DbYlV8Ie .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-DoYgk915DbYlV8Ie .rough-node .label,#mermaid-svg-DoYgk915DbYlV8Ie .node .label,#mermaid-svg-DoYgk915DbYlV8Ie .image-shape .label,#mermaid-svg-DoYgk915DbYlV8Ie .icon-shape .label{text-align:center;}#mermaid-svg-DoYgk915DbYlV8Ie .node.clickable{cursor:pointer;}#mermaid-svg-DoYgk915DbYlV8Ie .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-DoYgk915DbYlV8Ie .arrowheadPath{fill:#333333;}#mermaid-svg-DoYgk915DbYlV8Ie .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-DoYgk915DbYlV8Ie .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-DoYgk915DbYlV8Ie .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DoYgk915DbYlV8Ie .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-DoYgk915DbYlV8Ie .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DoYgk915DbYlV8Ie .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-DoYgk915DbYlV8Ie .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-DoYgk915DbYlV8Ie .cluster text{fill:#333;}#mermaid-svg-DoYgk915DbYlV8Ie .cluster span{color:#333;}#mermaid-svg-DoYgk915DbYlV8Ie div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-DoYgk915DbYlV8Ie .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-DoYgk915DbYlV8Ie rect.text{fill:none;stroke-width:0;}#mermaid-svg-DoYgk915DbYlV8Ie .icon-shape,#mermaid-svg-DoYgk915DbYlV8Ie .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DoYgk915DbYlV8Ie .icon-shape p,#mermaid-svg-DoYgk915DbYlV8Ie .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-DoYgk915DbYlV8Ie .icon-shape .label rect,#mermaid-svg-DoYgk915DbYlV8Ie .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DoYgk915DbYlV8Ie .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-DoYgk915DbYlV8Ie .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-DoYgk915DbYlV8Ie :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 输出
Android Framework
采集守护进程
Linux 内核
硬件层
PMU 事件
Context Switch
中断触发
Tx/Rx
App Lifecycle
VSYNC/Composition
Draw/Flush
生成
生成
解析
CPU Core (0-7)
GPU
DSP/ISP
Ftrace (Function Graph)
Scheduler (CFS/H-EAS)
IRQ/Softirq
Binder Driver
Atrace (Legacy)
Perfetto (Modern)
LMKD (低内存)
ActivityManagerService
SurfaceFlinger
RenderThread
HTML 报告 (Systrace)
Proto 文件 (Perfetto)
SQL 查询结果
2.2 核心组件职责表
| 组件 | 层级 | 职责 | 学术定义 |
|---|---|---|---|
| Ftrace | Kernel | 内核跟踪 | 内核提供的跟踪机制,记录函数调用、上下文切换、中断。 |
| Atrace | Framework | 插桩 | Android 添加的跟踪点(Tracepoints),如 am_activity_start。 |
| Perfetto | Daemon | 采集器 | 统一的采集守护进程,支持 Ftrace、Process Stats、Syscalls。 |
| Trace Processor | Tool | 分析引擎 | Perfetto 内置的 SQL 引擎,用于查询和分析 Trace 数据。 |
| SurfaceFlinger | Framework | 合成器 | 提供 VSYNC 信号和帧生命周期数据。 |
3. Systrace 的数据采集机制
3.1 Ftrace 与 Atrace 的结合
Systrace 的数据来源于两个层面:
- Kernel (Ftrace) : 记录 Context Switch (进程切换)、Function Graph (函数耗时)、IRQ(中断)。
- Framework (Atrace) : 记录 App Transition (动画)、Choreographer (Vsync)、Binder Transaction(IPC)。
学术定义:
- Context Switch : 当 CPU 从一个进程切换到另一个进程时,记录
(prev_pid, next_pid, prev_state, next_state)。这是分析 CPU 饥饿的关键。 - Tracepoint : 内核或 Framework 中预置的钩子函数。例如
sched_switch就是一个 Tracepoint。
3.2 关键 Trace 标签(Tags)
分析 Systrace 必须理解标签的含义。
| 标签颜色 | 含义 | 学术定义 |
|---|---|---|
| 绿色 (Running) | 运行中 | 线程占有 CPU,正在执行指令。 |
| 蓝色 (Runnable) | 就绪 | 线程在等待 CPU 调度(Run Queue)。 |
| 灰色 (Sleeping) | 休眠 | 线程阻塞(等待锁、IO、Binder)。 |
| 橙色 (Uninterruptible Sleep) | 深度休眠 | 通常在进行磁盘 IO,无法被信号打断(卡顿元凶)。 |
| 紫色 (Interrupt) | 中断 | 硬件中断或 Softirq 正在执行。 |
4. Perfetto 的下一代架构
4.1 为什么取代 Systrace?
| 特性 | Systrace | Perfetto |
|---|---|---|
| 采集时长 | 短(秒级) | 长(小时级) |
| 数据格式 | HTML (文本) | Proto (二进制) |
| 分析能力 | 可视化为主 | SQL 查询 + 聚合 |
| 系统开销 | 较高 | 极低(支持 Ring Buffer) |
| 数据源 | Ftrace + Atrace | Ftrace + Process Stats + Syscalls + Heap Profiling |
4.2 Perfetto 的架构
#mermaid-svg-7y4drsz7r5FECmWD{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-7y4drsz7r5FECmWD .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-7y4drsz7r5FECmWD .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-7y4drsz7r5FECmWD .error-icon{fill:#552222;}#mermaid-svg-7y4drsz7r5FECmWD .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-7y4drsz7r5FECmWD .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-7y4drsz7r5FECmWD .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-7y4drsz7r5FECmWD .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-7y4drsz7r5FECmWD .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-7y4drsz7r5FECmWD .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-7y4drsz7r5FECmWD .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-7y4drsz7r5FECmWD .marker{fill:#333333;stroke:#333333;}#mermaid-svg-7y4drsz7r5FECmWD .marker.cross{stroke:#333333;}#mermaid-svg-7y4drsz7r5FECmWD svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-7y4drsz7r5FECmWD p{margin:0;}#mermaid-svg-7y4drsz7r5FECmWD .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-7y4drsz7r5FECmWD .cluster-label text{fill:#333;}#mermaid-svg-7y4drsz7r5FECmWD .cluster-label span{color:#333;}#mermaid-svg-7y4drsz7r5FECmWD .cluster-label span p{background-color:transparent;}#mermaid-svg-7y4drsz7r5FECmWD .label text,#mermaid-svg-7y4drsz7r5FECmWD span{fill:#333;color:#333;}#mermaid-svg-7y4drsz7r5FECmWD .node rect,#mermaid-svg-7y4drsz7r5FECmWD .node circle,#mermaid-svg-7y4drsz7r5FECmWD .node ellipse,#mermaid-svg-7y4drsz7r5FECmWD .node polygon,#mermaid-svg-7y4drsz7r5FECmWD .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-7y4drsz7r5FECmWD .rough-node .label text,#mermaid-svg-7y4drsz7r5FECmWD .node .label text,#mermaid-svg-7y4drsz7r5FECmWD .image-shape .label,#mermaid-svg-7y4drsz7r5FECmWD .icon-shape .label{text-anchor:middle;}#mermaid-svg-7y4drsz7r5FECmWD .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-7y4drsz7r5FECmWD .rough-node .label,#mermaid-svg-7y4drsz7r5FECmWD .node .label,#mermaid-svg-7y4drsz7r5FECmWD .image-shape .label,#mermaid-svg-7y4drsz7r5FECmWD .icon-shape .label{text-align:center;}#mermaid-svg-7y4drsz7r5FECmWD .node.clickable{cursor:pointer;}#mermaid-svg-7y4drsz7r5FECmWD .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-7y4drsz7r5FECmWD .arrowheadPath{fill:#333333;}#mermaid-svg-7y4drsz7r5FECmWD .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-7y4drsz7r5FECmWD .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-7y4drsz7r5FECmWD .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-7y4drsz7r5FECmWD .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-7y4drsz7r5FECmWD .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-7y4drsz7r5FECmWD .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-7y4drsz7r5FECmWD .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-7y4drsz7r5FECmWD .cluster text{fill:#333;}#mermaid-svg-7y4drsz7r5FECmWD .cluster span{color:#333;}#mermaid-svg-7y4drsz7r5FECmWD div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-7y4drsz7r5FECmWD .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-7y4drsz7r5FECmWD rect.text{fill:none;stroke-width:0;}#mermaid-svg-7y4drsz7r5FECmWD .icon-shape,#mermaid-svg-7y4drsz7r5FECmWD .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-7y4drsz7r5FECmWD .icon-shape p,#mermaid-svg-7y4drsz7r5FECmWD .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-7y4drsz7r5FECmWD .icon-shape .label rect,#mermaid-svg-7y4drsz7r5FECmWD .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-7y4drsz7r5FECmWD .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-7y4drsz7r5FECmWD .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-7y4drsz7r5FECmWD :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 消费者
Perfetto Service
数据源 (Producers)
写入
写入
写入
写入
读取
生成 Trace
生成 Trace
Ftrace (Kernel)
Process Stats (ProcFS)
System Calls
Heap Profiler
Tracing Service
Shared Memory (Ring Buffer)
Trace Processor (SQL)
Web UI
学术定义:
- Producer: 数据生产者。可以是内核(Ftrace)或应用进程(Heap Profiler)。
- Shared Memory: 共享内存缓冲区。Producer 直接写入共享内存,避免 IPC 拷贝开销。
- Trace Processor : 基于 SQLite 的分析引擎。允许执行
SELECT * FROM sched WHERE dur > 10000000这样的查询来查找长耗时任务。
5. 性能瓶颈的定位逻辑
5.1 UI 卡顿分析(Jank Detection)
UI 卡顿在 Trace 中表现为 Frame Timeline 的断裂。
分析步骤:
- 找到 VSYNC : 查找
SurfaceFlinger的VSYNC-app信号。 - 检查 UI Thread : 查看
Choreographer#doFrame是否超过 16.6ms(60Hz)。 - 定位阻塞点 :
- 如果是 蓝色长条(Runnable):CPU 繁忙,被其他进程抢占。
- 如果是 灰色长条(Sleeping):等待 Binder 或锁。
- 如果是 橙色长条(Uninterruptible):磁盘 IO 慢。
- 检查 RenderThread: UI Thread 完成后,RenderThread 是否及时完成(dequeueBuffer/queueBuffer)。
5.2 Binder 阻塞分析
Binder 阻塞是应用无响应的主要原因。
分析步骤:
- 查找 Binder Transaction : 查找
binder_transaction事件。 - 计算耗时 :
reply - call的时间差。 - 定位服务端 : 查看
dest_node,找到被调用的进程。 - 分析服务端状态: 查看服务端进程在那个时间段在做什么(是否在 GC、是否在 IO)。
5.3 CPU 调度分析
学术定义:
- CPU Frequency (freq): CPU 的运行频率。如果频率上不去,性能会差。
- CPU Idle: CPU 进入休眠状态。如果频繁进出 Idle,功耗会增加。
- Big/Little: ARM 架构的大小核。大核(A75/A76)跑前台,小核(A53/A55)跑后台。
6. 关键源码与数据解析
6.1 Atrace 的插桩代码
Framework 中通过 Trace.beginSection() 添加标记。
java
// frameworks/base/core/java/android/os/Trace.java
public static void beginSection(String sectionName) {
if (sTracingEnabled) {
nativeTraceBegin(sectionName);
}
}
// frameworks/base/core/jni/android_os_Trace.cpp
static void android_os_Trace_beginSection(JNIEnv* env, jclass clazz, jstring name) {
ScopedUtfChars nameStr(env, name);
atrace_begin(ATRACE_TAG_APP, nameStr.c_str()); // 写入 Atrace
}
6.2 Perfetto 的 SQL 查询示例
使用 SQL 查找所有耗时超过 10ms 的 Binder 调用。
sql
SELECT
slice.name,
slice.ts,
slice.dur,
thread.name as thread_name,
process.name as process_name
FROM slice
JOIN thread_track ON slice.track_id = thread_track.id
JOIN thread USING (utid)
JOIN process USING (upid)
WHERE slice.name LIKE 'binder transaction%'
AND slice.dur > 10000000 -- 10ms (单位: ns)
ORDER BY slice.dur DESC;
7. 实战案例分析:点击响应慢
7.1 Trace 现象
- Input Dispatch :
input_dispatch事件在 10ms 内到达应用。 - Main Thread : 应用主线程在
performClick处出现 灰色长条(Sleeping)。 - Binder Call : 灰色长条对应一个
binder_transaction,目标进程是system_server。 - System Server : 在对应时间点,
system_server的AMS线程正在执行startActivity,且处于 橙色长条(Uninterruptible Sleep)。
7.2 推理结论
点击响应慢是因为 System Server 在启动新 Activity 时发生了磁盘 IO(可能是读取 dex 文件或资源),导致 Binder 调用阻塞,进而导致应用主线程阻塞。
解决方案:优化 System Server 的 IO,或预加载资源。
8. 性能分析的常见误区
| 误区 | 学术解释 |
|---|---|
| 只看 UI Thread | 错误。UI 卡顿往往是因为 RenderThread、Binder 线程或 System Server 阻塞。 |
| CPU 使用率低就是空闲 | 错误。可能是 CPU 频率(Governor)被锁在低档,或者进程被绑核(Affinity)限制了。 |
| Trace 越长越好 | 错误。Trace 越长,分析难度越大。应精准抓取问题发生的时间窗口(2-5秒)。 |
| Perfetto 只能看图表 | 错误。Perfetto 的强大在于 SQL 查询,可以进行海量数据的统计分析。 |
9. 本篇总结(Knowledge Closure)
| 关键点 | 纯学术定义 |
|---|---|
| Systrace 的本质 | 基于 Ftrace/Atrace 的事件快照,用于短时精确分析。 |
| Perfetto 的本质 | 基于 Probes 的全量采集器,支持长时分析和 SQL 查询。 |
| 性能分析本质 | 在时间轴上重构系统行为,通过因果推断定位瓶颈。 |
| UI 卡顿根源 | 通常是 Binder 阻塞、IO 延迟或 CPU 调度不当。 |
| SQL 分析 | 将 Trace 视为数据库,通过查询聚合发现宏观规律。 |
10. 第十板块结语
至此,第十板块:Android 系统稳定性与调试 已全部完结。
我们从 Watchdog 的死锁检测 出发,深入 ANR 的超时监控 ,探索 Tombstone 的临终快照 ,最终抵达 Systrace/Perfetto 的系统级性能分析。
我们揭示了 Android 稳定性与调试的核心逻辑:用监控预防死锁,用超时捕获无响应,用信号收集临终快照,用 Trace 重构系统行为。
下一篇预告 :第十一板块:Android 跨进程通信与 Binder 深度剖析 | 第二十七篇:Binder 线程池与死亡通知(Death Recipient)机制