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 展示了本节的核心知识框架与实战路线图,把显示启动链路、黑屏分类和排查路径放在同一张图中,便于建立整体认知。

Android 显示启动链路与黑屏诊断路线图 ① 显示启动链路 BootROM BootLoader Kernel init SystemServer SurfaceFlinger WindowManager → 应用渲染 → 首帧上屏 ② 黑屏分类与排查入口 全程黑屏 查 BootLoader / Kernel / 屏驱 开机动画后黑屏 查 SystemServer / SF 启动 应用内黑屏 查 Surface / 渲染 / 生命周期 偶发黑屏 查时序 / 竞态 / 资源 ③ 四步闭环实战路线 现象采集 logcat / dmesg / 录屏 阶段定位 按启动阶段缩小范围 根因验证 dumpsys / Perfetto 验证 修复复盘 沉淀清单与预防措施 核心思路:先定位阶段,再定位模块,最后定位根因

四、方法流程与案例场景

面对一个黑屏问题,推荐按以下流程推进:

  1. 确认现象:是全程黑屏、开机动画后黑屏,还是应用内黑屏;是否伴随声音、振动、按键响应。
  2. 采集日志:抓取 logcat、dmesg、kernel log,必要时录屏并记录时间点。
  3. 定位阶段:根据日志最后一条有效输出,判断卡在 BootLoader、Kernel、init、SystemServer 还是 SurfaceFlinger。
  4. 验证根因:用 dumpsys SurfaceFlinger、dumpsys window、Perfetto 查看合成与窗口状态。
  5. 修复并复盘:修改后回归验证,记录根因、修复方式和预防措施。

例如,某设备开机后一直黑屏,但能听到开机提示音。抓取 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
黑屏诊断最忌"跳步":没有确认阶段就直接改代码,往往会把简单问题复杂化。先定位,再动手。