AI 技术博客
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 层

工具看什么典型命令
logcatJava 日志、crash、ANR、avc deniedadb logcat | grep -iE "..."
dumpsys服务状态快照adb shell dumpsys input/activity/window
systrace/perfetto卡顿/掉帧/调度时序perfetto UI 抓 trace
bugreport一把抓全(log+dumpsys+trace)adb bugreport bug.zip
dropbox/tombstonecrash 现场/data/system/dropbox/data/tombstones

Native 层

工具看什么
tombstonenative crash 堆栈(信号/地址)
ndk-stack / addr2line把崩溃地址符号化成 源文件:行号
gdb / lldbnative 断点调试
strace / ltrace系统调用 / 库调用跟踪
simpleperfnative 性能采样(火焰图)

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. 踩坑提醒

  1. 工具选错层白费劲:卡 logo 用 logcat(还没起)、native crash 只看 logcat(要看 tombstone)——选错工具查半天没结果。
  2. 不抓 bugreport 直接问:报问题不附 bugreport,别人没法分析。先抓全现场。
  3. tombstone 不符号化看不懂:地址要 ndk-stack/addr2line 转成 源文件:行号 才有用。
  4. perfetto 比 systrace 新:新设备用 perfetto(perfetto.dev),systrace 已废弃。
  5. 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 崩/ANRlogcat + 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. 小结

  1. 全栈核心竞争力 = 快速定位,前提是知道每层有什么工具。
  2. 按层记工具:应用层 logcat/perfetto;native tombstone/ndk-stack;kernel dmesg/ftrace/pstore;硬件示波器。
  3. 现象→层→工具决策树:先判哪层,再选工具,从上往下逐层排除。
  4. bugreport 一把抓全,报问题先附它。
  5. 排查口诀:崩看 logcat/tombstone;卡用 perfetto;不通逐层 dumpsys→lshal→dmesg;死机看 pstore;功耗查 wakeup_sources。

下节预告

L23:实战——触控失灵从 App 追到 I2C —— 把这套武器库用起来,真追一个跨全栈的问题。

评论