引言
在车载 Android 系统开发中,稳定性问题是最让人头疼的挑战之一。与手机不同,车载系统对稳定性的要求近乎苛刻——想象一下,用户正在高速公路上行驶,导航突然黑屏,或者中控卡死无响应,这不仅仅是用户体验问题,更关乎行车安全。
经过多年的车载系统开发实践,我们将遇到的各类稳定性问题归纳为四大类:
| 类别 | 典型表现 | 影响程度 |
|---|---|---|
| 性能问题 | 卡顿、响应慢、发热 | ⭐⭐⭐ |
| 卡死问题 | 触摸无响应、系统挂起 | ⭐⭐⭐⭐⭐ |
| 黑屏问题 | 屏幕无显示、部分黑屏 | ⭐⭐⭐⭐⭐ |
| 显示异常 | 闪烁、错乱、显示不全 | ⭐⭐⭐ |
本文将逐一剖析这些问题的根因,并提供实战排查命令,希望能帮助各位少踩一些坑。
性能问题深度剖析
性能问题是稳定性问题的"前奏"。很多卡死和黑屏问题,追根溯源都是性能问题恶化的结果。车载系统的性能问题主要集中在五个维度:显存、CPU、内存、IO 和 GPU。
显存问题
显存问题在车载系统中尤为突出,因为现代座舱往往配备多块屏幕(中控、仪表、副驾、后排),加上 3D 场景、导航地图等图形密集型应用,显存压力巨大。
常见场景:
- 显存泄露:TaskView + 导航组合使用、人机共驾 + Mesa3D、AVM(环视)长时间运行
- 显存超标:3D 桌面 + Unreal 引擎、HMI 动效过度、Launcher 使用高分辨率壁纸和 PSD 屏视频
排查命令:
# 查看 GPU 内存使用情况(高通平台)cat/sys/class/kgsl/kgsl-3d0/gpubusycat/sys/class/kgsl/kgsl-3d0/gpu_available_frequencies# 查看显存分配情况dumpsys meminfo|grep-i"graphics\|gl\|egl"# 查看 SurfaceFlinger 图层信息dumpsys SurfaceFlinger --latency# 针对 AMD 平台cat/sys/kernel/debug/dri/0/amdgpu_vram_mm显存泄露最常见的原因是 Surface 或 Texture 没有正确释放。建议在应用的 `onDestroy()` 中显式调用 `release()` 方法。CPU 问题
CPU 问题分为调度问题和异常占用两类。
调度问题典型场景:
- 3D 场景 + 多屏场景下,应用启动关键线程未能获得足够优先级
- 前后台分组策略不合理,后台应用抢占前台资源
异常占用典型场景:
| 场景 | 表现 | 根因 |
|---|---|---|
| 应用切换截图 | system_server CPU 飙高 | 虚拟化环境使用 copy 方式而非 DMA |
| 桌面卡顿 | 桌面进程 CPU 持续高位 | 动效过度或布局计算复杂 |
| U 盘插入后卡顿 | usb kernel 线程占满单核 | 硬件中断风暴 |
| 语音功能 | CPU 100% | 哨兵长时间监听导致 mic 数据累积 |
排查命令:
# 实时查看 CPU 占用 TOP 进程top-m10-s cpu# 查看特定进程的线程 CPU 占用top-H -p<pid># 使用 simpleperf 进行 CPU 性能分析simpleperf record -p<pid>-g --duration10simpleperf report# 查看调度器状态cat/proc/schedstat# 查看进程调度策略cat/proc/<pid>/sched# 检查 CPU 频率和调度器cat/sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freqcat/sys/devices/system/cpu/cpu*/cpufreq/scaling_governor内存问题
内存问题是车载系统最常见的性能杀手。由于车载系统通常内存配置有限(相比手机),且需要长时间运行,内存泄漏的影响会被放大。
内存泄漏典型场景:
- 车控服务:车控信号