Android全栈8 分钟阅读4024 字
【全栈第22课】跨层问题定位武器库
Android 全栈工程师进阶教程 第22课。跨层问题定位武器库。基于公开 AOSP 知识整理,含原理、可编译示例、常见问题定位。
> 本文是《Android 全栈工程师进阶教程》系列第 22 课。完整 26 课见 GitHub 仓库。
【全栈第22课】跨层问题定位武器库
0. 这节课你将搞懂什么
建立一套"哪一层的问题用哪个工具查"的完整武器库。 学完你能回答:拿到一个现象,我怎么快速判断该用 logcat 还是 dmesg 还是 perfetto 还是 ramdump?每个工具管哪一层、能看什么? 这是 BSP 工程师最值钱的能力——不是会写代码,而是任何现象都能快速定位到正确的层和代码。
1. 背景:全栈工程师的核心竞争力是定位
写代码大家都会,真正区分水平的是:线上来一个奇葩问题,你能多快定位到根因。定位的前提是知道每一层有什么观测工具。这一课把前面散落在各课的工具系统化,形成你的"工具地图"。
2. 全局图:按层归类的工具
应用/Framework 层(Java)
logcat / dumpsys / systrace·perfetto / bugreport / dropbox·tombstone
↓
Native 层(C/C++)
tombstone / ndk-stack·addr2line / gdb·lldb / strace / simpleperf
↓
Kernel 层
dmesg / ftrace / /proc·/sys / kgdb / ramdump·pstore / perf
↓
硬件层
示波器 / 逻辑分析仪 / 万用表
3. 各层工具详解(管什么、怎么用)
应用/Framework 层
| 工具 | 看什么 | 典型命令 |
|---|---|---|
| logcat | Java 日志、crash、ANR、avc denied | adb logcat | grep -iE "..." |
| dumpsys | 服务状态快照 | adb shell dumpsys input/activity/window |
| systrace/perfetto | 卡顿/掉帧/调度时序 | perfetto UI 抓 trace |
| bugreport | 一把抓全(log+dumpsys+trace) | adb bugreport bug.zip |
| dropbox/tombstone | crash 现场 | /data/system/dropbox、/data/tombstones |
Native 层
| 工具 | 看什么 |
|---|---|
| tombstone | native crash 堆栈(信号/地址) |
| ndk-stack / addr2line | 把崩溃地址符号化成 源文件:行号 |
| gdb / lldb | native 断点调试 |
| strace / ltrace | 系统调用 / 库调用跟踪 |
| simpleperf | native 性能采样(火焰图) |
Kernel 层
| 工具 | 看什么 |
|---|---|
| dmesg | 内核日志(驱动 pr_info、panic、oops) |
| ftrace | 内核函数级 trace(/sys/kernel/tracing) |
| /proc, /sys | 内核状态(interrupts/clk/regulator/进程) |
| kgdb | 内核断点调试(需串口) |
| ramdump / pstore | 死机现场内存转储(/sys/fs/pstore、last_kmsg) |
| perf | 内核性能 profiling |
硬件层
示波器(看 I2C SCL/SDA、SPI、上电时序波形)、逻辑分析仪(抓协议时序)、万用表(量电压)。
4. 前置准备
- 依赖前面各课(每课的"常见问题分析"用到的工具,这里汇总)。
- 本课是工具地图 + 决策树,产出文档。
5. 动手:现象→层→工具 决策树(最核心)
拿到一个现象,这样选工具:
├─ App 崩/ANR → logcat + /data/tombstones + bugreport
│ Java crash → logcat 看异常栈;native crash → tombstone + ndk-stack 符号化
├─ 卡顿掉帧 → perfetto/systrace → 看哪个线程/binder 卡(接 L4)
├─ 功能不工作:
│ 服务没起 → logcat 看 avc denied(L6)+ dumpsys(L2/L3)
│ HAL 拿不到 → lshal + vintf + sepolicy(L7/L9/L10/L11)
│ 硬件没数据 → dmesg 驱动日志 → probe?中断?I2C?(L14-L17)
├─ 死机重启 → ramdump/pstore/last_kmsg → kernel panic 栈(L24)
├─ 功耗高 → wakelock/cpu频率/regulator(L18/L25)
└─ 开不了机 → 先判分水岭(L21):logo 前看 dmesg,logo 后看 logcat
6. 看底层:一条龙抓日志(最实用)
遇到任何问题,先一把抓全现场,再慢慢分析:
adb bugreport bug.zip # 一把抓全(给别人看问题先要这个,含 log+dumpsys+trace)
adb logcat -b all -d > log.txt # 所有 buffer 的日志
adb shell dmesg > kmsg.txt # 内核日志
adb pull /data/tombstones/ # native crash
adb pull /data/anr/ # ANR trace
adb shell cat /sys/fs/pstore/console-ramoops-0 # 上次死机的 kernel 日志
bugreport 是最重要的:它把 logcat、dmesg、dumpsys、trace、电池统计全打包,用 Battery Historian / Perfetto 能图形化分析。报问题给别人先附 bugreport。
7. 编译 & 运行(本课无编译产物)
见第 5、6 节命令。 > 验证状态(诚实):本课为工具地图/方法论,无编译产物。命令均为标准 Android 调试命令。
8. 踩坑提醒
- 工具选错层白费劲:卡 logo 用 logcat(还没起)、native crash 只看 logcat(要看 tombstone)——选错工具查半天没结果。
- 不抓 bugreport 直接问:报问题不附 bugreport,别人没法分析。先抓全现场。
- tombstone 不符号化看不懂:地址要 ndk-stack/addr2line 转成 源文件:行号 才有用。
- perfetto 比 systrace 新:新设备用 perfetto(perfetto.dev),systrace 已废弃。
- debugfs 节点量产机可能关:
/sys/kernel/debug/下的(ftrace/binder stats)需要 debugfs + root,量产机常关。
9. 常见问题分析与定位(怎么用这套武器库)
9.1 这一课本身就是"定位方法论",这里给几个综合实战
综合① 用户反馈"App 偶尔卡一下"
- 用 perfetto 抓一段(复现时),看主线程时间线:是 binder 调用慢(L1/L4)?还是某个 Message 处理久(L4)?还是 GC?还是 IO?
- perfetto 的 trace 能看到每个线程在每个时刻干什么,卡顿一目了然。
综合② "某功能用着用着就没反应了"
- 先 logcat 看有没有 crash/ANR/Exception;没有的话 dumpsys 对应服务看状态;再不行往下层(HAL lshal、驱动 dmesg)查。
- 从上往下逐层排除,每层用对应工具确认"这层正常吗"。
综合③ "设备发烫/掉电快"
- bugreport → Battery Historian 看耗电时间线;
dumpsys batterystats看耗电归因;top/cpufreq 看 CPU;wakeup_sources 看 wakelock(L18/L25)。
9.2 工具速查表(背下来)
| 我要查 | 用 |
|---|---|
| Java 崩/ANR | logcat + traces.txt + tombstone |
| 卡顿 | perfetto |
| 服务/HAL 状态 | dumpsys / lshal |
| SELinux 拒绝 | logcat/dmesg grep avc |
| 内核/驱动 | dmesg + /proc/interrupts + ftrace |
| 死机 | pstore/ramdump |
| 功耗 | batterystats + wakeup_sources + regulator_summary |
| 硬件信号 | 示波器/逻辑分析仪 |
9.3 定位总决策树
任何现象
├─ 先判在哪层:App 崩→Java;native crash→tombstone;卡顿→perfetto
├─ 功能不通 → 从上往下逐层:logcat→dumpsys→lshal→dmesg→硬件
├─ 死机 → pstore/ramdump(L24)
├─ 功耗 → batterystats/wakeup_sources(L25)
├─ 开机 → 分水岭(L21)
└─ 拿不准 → 先 adb bugreport 抓全现场再分析
10. 小结
- 全栈核心竞争力 = 快速定位,前提是知道每层有什么工具。
- 按层记工具:应用层 logcat/perfetto;native tombstone/ndk-stack;kernel dmesg/ftrace/pstore;硬件示波器。
- 现象→层→工具决策树:先判哪层,再选工具,从上往下逐层排除。
- bugreport 一把抓全,报问题先附它。
- 排查口诀:崩看 logcat/tombstone;卡用 perfetto;不通逐层 dumpsys→lshal→dmesg;死机看 pstore;功耗查 wakeup_sources。
下节预告
L23:实战——触控失灵从 App 追到 I2C —— 把这套武器库用起来,真追一个跨全栈的问题。