车载 Android 黑卡死问题定义和分配原则

黑卡死问题定义

  • 黑卡死是车机屏幕出现全屏且持续显示异常的统称,包括黑屏、白屏、闪屏、卡死、异常重启等
  • 问题分配的核心原则:先定位现象范围,再确定首要分析方
  • 本文提供高通平台完整的问题分类树和分配规则,附带各类问题的排查方法

引言

"又黑屏了!"------这可能是车机测试群里最让人心跳加速的三个字。

作为车机系统最严重的问题类型之一,黑卡死问题有着让人头疼的"三高"特点:严重程度高、紧急程度高、排查难度高。更让人崩溃的是,这类问题往往涉及多个团队(MCU、QNX、Android、BSP、应用),一不小心就变成了各方"踢皮球"的重灾区。

我曾经历过一个项目,一个黑屏问题在5个团队之间流转了两周,最后发现是电源管理模块的一个时序问题。如果一开始就有清晰的分配原则,这个问题可能三天就能定位。

本文的目的,就是基于多个高通平台项目的黑卡死问题排查经验,建立一套清晰、可执行的问题分配和排查规则,让问题能够快速精确地找到"第一责任人"。


适用范围与阅读对象

适用范围

  • 硬件平台:高通车机平台(SA8155P、SA8295P 等)
  • 软件架构:QNX Hypervisor + Android 的多系统架构
  • 屏幕配置:中控屏 + 仪表屏的双屏/多屏方案

阅读对象

角色 关注重点
项目管理 问题分配规则、流转流程
软件架构 整体排查思路、跨域协作
研发质量 问题分类标准、复盘依据
研发工程师 具体排查方法、日志分析
测试工程师 问题描述规范、信息收集

黑卡死问题定义

什么是黑卡死?

本文讨论的是广义的黑卡死问题 ,可以理解为车机屏幕出现全屏且持续的显示异常。

注意关键词:全屏 + 持续。局部 UI 异常或短暂闪烁通常不归入此类。

现象分类

现象 描述
黑屏 屏幕全黑,无任何显示内容(可能有/无背光)
白屏 屏幕全白,无法显示正常内容
绿屏 屏幕显示纯绿色(通常与视频解码相关)
花屏 屏幕显示杂乱的色块或条纹
闪屏 屏幕内容持续闪烁或间歇性黑屏
卡屏 屏幕内容定格,触摸无响应
异常重启 系统非预期重启(可能伴随短暂黑屏)

与其他问题的区别

问题类型 范围 持续性 是否属于黑卡死
全屏黑屏超过3秒 全屏 持续 ✅ 是
某个应用界面卡住 局部 持续 ❌ 否(应用ANR)
开机Logo显示时间过长 全屏 非持续 ❌ 否(启动性能问题)
切换应用时闪一下黑屏 全屏 非持续 ❌ 否(过渡动画问题)
整个系统触摸无响应 全屏 持续 ✅ 是(卡死)

高通平台问题分配原则

总体原则

核心思路:现象定位 → 范围判断 → 首要分析方 → 逐级排查

markdown 复制代码
问题报告 ──▶ 现象是什么?──▶ 影响范围多大?──▶ 分配给首要分析方
                │                  │
                ▼                  ▼
           黑屏/卡死/重启等    中控/仪表/全部

首要分析方说明

在进入具体分类之前,先了解各分析方的职责:

分析方 职责范围 典型问题
MCU 整车电源管理、休眠唤醒、看门狗 全系统黑屏、异常重启
QNX Hypervisor、显示资源调度、早期启动 多屏同时异常
BSP Linux/Android内核、驱动、Display子系统 显示驱动异常
Android FW Framework层、SurfaceFlinger、SystemServer 中控卡死、ANR
仪表HMI 仪表应用层渲染 仪表闪屏、仪表卡死
仪表中间件 仪表数据通信、刷新机制 仪表数据异常
对应应用 具体App 单应用卡死
性能团队 系统性能优化 整体卡顿

问题分类与分配详解

一、黑屏问题

黑屏是最常见也最"吓人"的问题类型。根据影响范围持续性,分为以下子类:

1.1 持续黑屏

现象一:中控和仪表都黑屏

首要分析方:MCU 与 QNX 电源模块

分析思路

排查步骤

  1. 检查 MCU 串口日志,确认 MCU 状态
  2. 检查 QNX 串口日志,确认 Hypervisor 启动状态
  3. 检查各显示屏背光控制信号
  4. 确认 SOC 主芯片电源时序是否正常

关键日志

bash 复制代码
# MCU 日志关注点
[MCU] Power state: xxx
[MCU] Watchdog: xxx

# QNX 日志关注点
[QNX] display_manager: initialized
[QNX] screen: display attached

后续流转

  • 若发现异常 → 交对应团队分析
  • 若 MCU/QNX 正常 → BSP 分析
  • 若 BSP 正常 → 由项目/质量拉通各方分析,架构支持

现象二:仅仪表黑屏(中控正常)

首要分析方:BSP

分析思路

排查步骤

  1. 检查仪表屏 MIPI/LVDS 信号是否正常
  2. 查看 Display 驱动日志,确认屏幕初始化状态
  3. 检查仪表系统 HMI 渲染进程状态
  4. 对比中控显示链路,排查差异点

现象三:仅中控黑屏(仪表正常)

首要分析方:MCU 与 QNX 电源模块

分析思路

中控单独黑屏,仪表正常,说明 SOC 主芯片在运行,问题可能在:

  • 中控屏电源管理
  • Android 显示通道
  • SurfaceFlinger 状态

排查步骤

  1. 检查中控屏背光、电源状态
  2. 检查 Android SurfaceFlinger 状态
  3. 查看 Display HAL 层日志
  4. 检查 QNX 到 Android 的显示资源分配

后续流转

  • MCU/QNX 异常 → 对应团队
  • 若正常 → Android FW 分析 → BSP 分析 → 项目拉通

1.2 闪屏

仪表闪屏

首要分析方:仪表 HMI

常见原因

  • HMI 渲染帧率不稳定
  • 图层切换时序问题
  • VSync 同步异常

排查步骤

  1. 检查仪表 HMI 帧率统计
  2. 分析图层切换日志
  3. 检查 VSync 信号是否正常

后续流转:HMI 正常 → BSP 分析 → 项目拉通


中控闪屏

首要分析方:Android 前台应用

分析思路


1.3 部分区域黑屏

首要分析方:对应应用

说明:部分区域黑屏通常是某个应用的 Surface 未正确渲染,直接交给对应应用分析。


二、卡死问题

卡死的特点是:屏幕有显示,但触摸无响应或界面定格

2.1 中控卡死

整个屏幕卡死,各处点击都无响应

首要分析方:Android FW

分析思路

关键排查命令

bash 复制代码
# 检查 SystemServer 状态
adb shell dumpsys activity

# 检查输入子系统
adb shell dumpsys input

# 获取 ANR traces
adb pull /data/anr/traces.txt

# 检查系统负载
adb shell top -n 1
adb shell cat /proc/loadavg

单个应用卡死

首要分析方:对应应用

排查步骤

  1. 获取应用的 ANR traces
  2. 分析应用主线程状态
  3. 检查是否有死锁或长耗时操作

2.2 仪表卡死

首要分析方:仪表 HMI 或仪表中间件

分析思路


三、卡顿问题

卡顿与卡死的区别:卡顿有响应,只是响应慢;卡死完全无响应

3.1 整个系统卡顿、响应慢

首要分析方:性能团队

排查方向

  • CPU 占用率、调度情况
  • 内存压力、Swap 使用
  • IO 等待、磁盘性能
  • 温控降频情况

3.2 单个应用卡顿

首要分析方:对应应用


四、异常重启

4.1 仪表、中控都重启

首要分析方:MCU

分析思路


4.2 仅中控重启(仪表正常)

首要分析方:Android FW

分析思路

关键日志获取

bash 复制代码
# 获取上次重启前的内核日志
adb shell cat /sys/fs/pstore/console-ramoops-0

# 获取 tombstone
adb pull /data/tombstones/

# 检查重启原因
adb shell getprop ro.boot.bootreason

问题分配速查表

为便于快速查阅,汇总如下:

问题现象 首要分析方 后续流转
中控仪表都黑屏 MCU/QNX电源 → BSP → 项目拉通
仅仪表黑屏 BSP → 仪表HMI → 项目拉通
仅中控黑屏 MCU/QNX电源 → Android FW → BSP → 项目拉通
仪表闪屏 仪表HMI → BSP → 项目拉通
中控闪屏 前台应用 → Android FW → BSP → 项目拉通
部分区域黑屏 对应应用 → 项目拉通
中控整体卡死 Android FW → BSP → 项目拉通
单应用卡死 对应应用 → 项目拉通
仪表卡死 仪表HMI/中间件 → BSP → 项目拉通
整体卡顿 性能团队 → 项目拉通
单应用卡顿 对应应用 → 项目拉通
全系统重启 MCU → QNX中间件 → BSP → 项目拉通
仅中控重启 Android FW → BSP → 项目拉通

问题报告规范

为了让问题能够快速被分析,测试同学在提交黑卡死问题时,请包含以下信息:

必填信息

markdown 复制代码
## 问题描述
- 现象:[黑屏/卡死/闪屏/重启]
- 影响范围:[中控/仪表/全部]
- 持续时间:[持续/间歇/已恢复]
- 复现频率:[必现/高概率/偶发]

## 环境信息
- 车型项目:
- 软件版本:
- 硬件版本:

## 操作步骤
1. xxx
2. xxx
3. 问题出现

## 日志附件
- [ ] MCU 日志
- [ ] QNX 日志
- [ ] Android logcat
- [ ] kernel log
- [ ] ANR traces(如有)
- [ ] tombstone(如有)

日志采集脚本示例

bash 复制代码
#!/bin/bash
# collect_blackscreen_logs.sh
# 黑卡死问题日志采集脚本

TIMESTAMP=$(date +%Y%m%d_%H%M%S)
LOG_DIR="blackscreen_logs_${TIMESTAMP}"

mkdir -p ${LOG_DIR}

# Android 日志
adb logcat -d > ${LOG_DIR}/logcat.txt
adb shell dmesg > ${LOG_DIR}/dmesg.txt
adb bugreport > ${LOG_DIR}/bugreport.zip

# ANR 和 tombstone
adb pull /data/anr/ ${LOG_DIR}/anr/
adb pull /data/tombstones/ ${LOG_DIR}/tombstones/

# 系统状态
adb shell dumpsys meminfo > ${LOG_DIR}/meminfo.txt
adb shell dumpsys cpuinfo > ${LOG_DIR}/cpuinfo.txt
adb shell dumpsys SurfaceFlinger > ${LOG_DIR}/surfaceflinger.txt
adb shell dumpsys input > ${LOG_DIR}/input.txt

# pstore (重启后)
adb shell cat /sys/fs/pstore/console-ramoops-0 > ${LOG_DIR}/pstore.txt 2>/dev/null

echo "日志已采集到 ${LOG_DIR} 目录"

常见问题 FAQ

Q1: 问题被分配后,分析方认为不是自己的问题怎么办?

A : 首要分析方有责任给出明确的分析结论,说明:

  • 自己负责的模块状态是否正常
  • 提供支撑结论的日志证据
  • 建议下一步由谁分析

不能简单回复"不是我的问题"就转走。

Q2: 问题复现不了怎么办?

A:

  1. 增加日志级别,部署监控脚本
  2. 与测试沟通具体操作场景
  3. 尝试压力测试复现
  4. 分析历史日志,寻找规律

Q3: 多个团队的结论相互矛盾怎么办?

A : 由软件架构项目技术负责人组织联合排查会议,各方带着日志和证据一起分析。


总结

黑卡死问题的高效解决,依赖于:

  1. 清晰的分类标准 ------ 知道问题属于哪一类
  2. 明确的分配原则 ------ 知道先找谁分析
  3. 规范的流转机制 ------ 知道分析不出来找谁
  4. 完善的日志采集 ------ 有足够的信息支撑分析

希望本文能够帮助各项目团队在面对黑卡死问题时,不再"踢皮球",而是快速、精准地定位和解决问题。

记住:没有解决不了的 bug,只有找不到的 root cause。而找到 root cause 的前提,是先找对分析它的人。


相关推荐
拾忆,想起4 小时前
Dubbo多协议暴露完全指南:让一个服务同时支持多种通信方式
xml·微服务·性能优化·架构·dubbo
MACKEI4 小时前
数据库操作性能优化方法文档
数据库·性能优化
郝学胜-神的一滴5 小时前
Linux C++会话编程:从基础到实践
linux·运维·服务器·开发语言·c++·程序人生·性能优化
Evan芙6 小时前
总结常见fastcgi相关的性能优化参数
性能优化
PineappleCoder15 小时前
还在重复下载资源?HTTP 缓存让二次访问 “零请求”,用户体验翻倍
前端·性能优化
添加shujuqudong1如果未回复1 天前
探索含光伏、火电与飞轮储能系统的奇妙调频之旅
性能优化
山楂树の1 天前
ImageBitmap 将图像数据转换为GPU可用的纹理
性能优化·图形渲染·canva可画
拾忆,想起1 天前
Dubbo服务调用幂等性深度解析:彻底解决重复请求的终极方案
微服务·性能优化·服务发现·dubbo
拾忆,想起1 天前
Dubbo深度解析:从零到一,高性能RPC框架如何重塑微服务架构
网络协议·微服务·云原生·性能优化·rpc·架构·dubbo