2、黑屏问题现象分类:预览黑屏、录像黑屏、拍照黑屏、切换摄像头黑屏的典型表现
Camera HAL 层黑屏问题并非单一故障,而是表现为多种场景下的画面异常。不同场景对应不同的数据通路与模块依赖,故障根因往往差异显著。本节从四种典型黑屏场景出发,梳理其现象特征、触发条件与初步排查方向。
2.1 四种黑屏场景的典型表现对比
| 场景 | 典型表现 | 用户操作 | 关键观察点 |
|---|---|---|---|
| 预览黑屏 | 打开相机后,预览界面持续黑屏,无画面输出;有时伴随“相机无响应”提示 | 启动相机应用 | Sensor 是否启动、ISP 管线是否建立、Surface 是否成功注册 |
| 录像黑屏 | 预览正常,点击录像按钮后画面变黑;或录像文件播放为全黑 | 开始录像 | Video 编码器是否获取到帧、编码器内存是否泄漏、MediaCodec 状态 |
| 拍照黑屏 | 预览正常,按下快门后取景画面短暂黑屏或拍出的照片全黑 | 拍照 | Capture Request 是否下发、ZSL 缓冲区是否为空、JPEG 编码是否超时 |
| 切换摄像头黑屏 | 从前摄切后摄(或反向)时,画面变黑且无法恢复;有时需重启相机 | 切换摄像头 | Session 重建是否成功、Stream 配置是否冲突、Sensor 电源时序 |
排查提示: 预览黑屏是 HAL 层最基础的故障场景,通常涉及 Sensor 驱动、MIPI 链路或 ISP 初始化失败。录像与拍照黑屏往往在预览正常的基础上发生,问题多集中在编码器或 JPEG 处理模块。切换摄像头黑屏则与 Session 生命周期管理强相关,常见于多 Camera 并发场景。
2.2 预览黑屏:数据通路中断的典型表现
预览黑屏是最常见的 HAL 层故障,其本质是 Camera 数据流从 Sensor 到 SurfaceFlinger 的链路中断。典型表现包括:
- 全黑无任何 UI 元素: 打开相机后,预览区域完全黑色,无画面、无闪烁、无噪点。
- 短暂闪黑后恢复: 启动时出现 1-3 秒黑屏,随后正常显示,通常为 Sensor 初始化延迟或 ISP 预热。
- 持续黑屏但 UI 可操作: 按钮、菜单正常响应,但预览区域始终无画面,表明 HAL 层未向 Surface 投递帧。
- 黑屏伴随 ANR: 长时间黑屏后弹出“相机无响应”对话框,通常因 HAL 线程阻塞或死锁。
快速定位: 在 logcat 中搜索
processCaptureRequest 或 flush 关键字,若 HAL 未收到 Request,则问题在 Framework 到 HAL 的通信层;若收到 Request 但未返回 Buffer,则问题在 HAL 内部管线。
2.3 录像黑屏:编码器与内存泄漏的关联
录像黑屏的典型特征是 预览正常,但录像开始后画面变黑。这通常意味着 Camera 数据流在编码器入口处被截断。常见表现:
- 点击录像后立即黑屏: 录像按钮按下瞬间预览画面消失,录像文件生成但内容全黑。
- 录像过程中间歇性黑屏: 录像开始后几秒内正常,随后画面变黑,之后可能恢复,呈现闪烁状。
- 录像文件大小异常: 文件大小远小于正常值(如 10 秒视频仅几百 KB),说明编码器未收到足够帧数据。
- 内存泄漏伴随现象: 多次录像后系统内存持续增长,最终导致录像黑屏或应用崩溃。
内存泄漏警示: 录像场景是内存泄漏的高发区。HAL 层在编码器 Buffer 队列中未正确释放已处理帧,或 MediaCodec 的 InputBuffer 未及时回收,都会导致内存持续增长,最终触发 OOM 或编码器饥饿。
2.4 拍照黑屏:ZSL 与 JPEG 编码的故障点
拍照黑屏通常表现为 按下快门后取景画面短暂黑屏,或拍出的照片全黑。其故障点集中在 Capture 流程的特定阶段:
- 按下快门瞬间黑屏: 取景画面在拍照瞬间变黑,0.5-2 秒后恢复,但照片正常。这通常是 ZSL(零快门延迟)模式下 HAL 层切换 Stream 配置导致的短暂中断。
- 照片全黑但预览正常: 预览画面清晰,拍出的照片却全黑。这通常意味着 Capture Request 的 Sensor 曝光参数未正确设置,或 ISP 未对拍照帧做处理。
- 拍照后预览无法恢复: 拍照后预览画面永久黑屏,需重启相机。这通常因 HAL 层在拍照流程中发生异常,未正确恢复预览 Stream。
- 连拍黑屏: 连续拍照时,部分照片黑屏,部分正常。这通常与 Buffer 复用或内存分配失败有关。
2.5 切换摄像头黑屏:Session 重建的典型故障
切换摄像头黑屏是 多 Camera 协同场景下的特有故障,其表现与 Session 生命周期管理密切相关:
- 切换后永久黑屏: 从前摄切换到后摄(或反向)后,预览画面完全黑屏,无法恢复。通常因新 Session 创建失败,或旧 Session 未正确关闭导致资源冲突。
- 切换后闪黑再恢复: 切换过程中出现 1-2 秒黑屏,随后正常显示。这属于正常行为,但若黑屏时间过长(>3 秒),则可能涉及 Sensor 电源时序或 MIPI 重新协商问题。
- 多次切换后黑屏: 前几次切换正常,多次切换后出现黑屏。这通常与内存泄漏相关——每次切换未释放的 Session 资源累积,最终导致资源耗尽。
- 特定方向切换黑屏: 仅从前摄切后摄时黑屏,反向正常。这通常指向特定 Camera 的硬件或驱动问题。
2.6 黑屏场景与数据流路径的对应关系
下图展示了四种黑屏场景在 Camera 数据流中的故障位置,帮助定位问题模块:
2.7 黑屏问题排查优先级建议
根据实际项目经验,四种黑屏场景的排查优先级与常见根因分布如下:
- 预览黑屏(最高优先级): 影响所有相机功能,通常为 Sensor 驱动、MIPI 链路或 ISP 初始化问题。建议优先排查 dmesg 中的 Sensor 上电时序与 MIPI 锁定状态。
- 切换摄像头黑屏(高优先级): 影响用户体验,通常与 Session 管理或内存泄漏相关。建议优先检查
configureStreams返回值与 Session 销毁日志。 - 录像黑屏(中优先级): 预览正常但录像异常,问题范围较窄。建议优先检查编码器 Buffer 队列状态与内存使用趋势。
- 拍照黑屏(中优先级): 通常为 Capture 流程的特定参数问题。建议优先检查 Capture Request 中的 Sensor 曝光时间与 Gain 设置。
经验法则: 若黑屏问题在多次操作后出现(如第 5 次录像、第 3 次切换),优先怀疑内存泄漏。若黑屏问题在首次操作即出现,优先怀疑硬件初始化或配置错误。