1. 课程导入
Android 设备从按下电源键到屏幕亮起第一帧画面,看似只是一瞬间,背后却串联了引导加载、内核显示驱动、SurfaceFlinger 合成、WindowManager 窗口管理、应用进程渲染等多层协作。任何一层出现异常,用户看到的结果往往都是同一个现象——黑屏。因此,黑屏故障诊断的难点不在于"看到黑屏",而在于如何把黑屏这个笼统现象,快速拆解为可定位、可验证的具体环节。
本课程的目标,是帮助你把"黑屏"从一个模糊的用户抱怨,转化为一条可追踪的显示启动链路,并掌握每一环的观测手段、判断依据与修复思路。
一、学习目标
- 理解 Android 显示启动的完整链路:从 BootROM、BootLoader、Kernel、init、SurfaceFlinger 到应用首帧上屏。
- 掌握黑屏故障的分类方法:按发生阶段分、按显示层级分、按软硬件归属分。
- 能够使用 logcat、dmesg、dumpsys、systrace/Perfetto、SurfaceFlinger 日志等工具采集关键证据。
- 能够根据现象快速缩小范围,形成"现象—阶段—模块—根因"的排查路径。
- 建立复盘意识,把单次故障沉淀为可复用的诊断清单与预防措施。
二、核心概念
要诊断黑屏,先要建立几个关键概念。第一是显示启动阶段:开机显示并非一步完成,而是分为 BootLoader 阶段、Kernel 阶段、init 阶段、SystemServer 阶段、SurfaceFlinger 阶段和应用首帧阶段。不同阶段的黑屏,日志特征和排查入口完全不同。
第二是显示合成链路:应用通过 Surface 提交缓冲区,SurfaceFlinger 负责合成,Hardware Composer 负责送显,最终由显示驱动点亮屏幕。这条链路上任何一环阻塞,都会表现为黑屏或长时间黑屏。
第三是黑屏类型:可分为"全程黑屏""开机动画后黑屏""进入应用后黑屏""亮屏后立即黑屏""偶发黑屏"等。类型不同,根因分布差异很大。
三、整体知识框架
本课程的知识框架可以概括为"一条链路、两类工具、三层排查、四步闭环"。
- 一条链路:BootROM → BootLoader → Kernel → init → SystemServer → SurfaceFlinger → WindowManager → 应用渲染 → 首帧上屏。
- 两类工具:日志类工具(logcat、dmesg、kernel log)与状态类工具(dumpsys、Perfetto、systrace、SurfaceFlinger dump)。
- 三层排查:系统启动层、显示合成层、应用渲染层。
- 四步闭环:现象采集 → 阶段定位 → 根因验证 → 修复复盘。
下面的 SVG 展示了本节的核心知识框架与实战路线图,把显示启动链路、黑屏分类和排查路径放在同一张图中,便于建立整体认知。
四、方法流程与案例场景
面对一个黑屏问题,推荐按以下流程推进:
- 确认现象:是全程黑屏、开机动画后黑屏,还是应用内黑屏;是否伴随声音、振动、按键响应。
- 采集日志:抓取 logcat、dmesg、kernel log,必要时录屏并记录时间点。
- 定位阶段:根据日志最后一条有效输出,判断卡在 BootLoader、Kernel、init、SystemServer 还是 SurfaceFlinger。
- 验证根因:用 dumpsys SurfaceFlinger、dumpsys window、Perfetto 查看合成与窗口状态。
- 修复并复盘:修改后回归验证,记录根因、修复方式和预防措施。
例如,某设备开机后一直黑屏,但能听到开机提示音。抓取 logcat 发现 SystemServer 已启动,SurfaceFlinger 日志停在 "createDisplay" 之后。进一步用 dumpsys SurfaceFlinger 发现没有可用显示设备,最终定位为显示驱动初始化失败。这个案例说明:黑屏不等于屏幕坏,也不等于应用问题,必须按阶段逐层排除。
五、常见误区与复盘
| 误区 | 问题 | 正确做法 |
|---|---|---|
| 一看到黑屏就查应用代码 | 忽略启动阶段差异,容易南辕北辙 | 先判断黑屏发生在哪个启动阶段 |
| 只抓 logcat 不看 kernel log | 底层显示驱动问题无法暴露 | logcat 与 dmesg 同时采集 |
| 把偶发黑屏当必现问题查 | 难以复现,浪费大量时间 | 结合时序工具抓竞态与资源瓶颈 |
| 修复后不做复盘 | 同类问题反复出现 | 沉淀诊断清单与预防措施 |
本课程后续将围绕这条链路逐层展开:从启动阶段日志分析,到 SurfaceFlinger 合成机制,再到应用首帧渲染与黑屏定位实战。掌握本节的知识框架后,你应当能够把任何一个黑屏问题,先放进"阶段—模块—根因"的坐标系中,再选择对应的工具和方法进行验证。
# 常用诊断命令速查
adb logcat -b all -v threadtime > logcat.txt
adb shell dmesg > dmesg.txt
adb shell dumpsys SurfaceFlinger > sf.txt
adb shell dumpsys window > window.txt
adb shell ps -A | grep surfaceflinger