车机开启 SurfaceFlinger & HWC 日志完整指南
针对车机环境,以下是实战验证过的开启方法。车机 ROM 通常裁剪严重,但通过正确组合属性,90% 以上能成功。
一、准备工作(必须)
✅ 1. 获取 root 权限
adb root
如果失败,尝试:
adb shell su
或联系厂商获取调试权限
✅ 2. 确认车机芯片平台
adb shell getprop ro.board.platform
adb shell getprop ro.hardware.chipname
常见车机平台:
• 高通:qcom / msm / sm
• 瑞芯微:rk / rockchip
• 全志:sunxi
• 联发科:mt / mtk
• 华为海思:hi / hisilicon
二、SurfaceFlinger 日志开启(车机通用)
✅ 方法 A:基础属性(最有效)
1. 设置日志级别
adb shell setprop debug.sf.log 1
adb shell setprop debug.sf.log_transactions 1
adb shell setprop debug.sf.log_composition_type 1
2. 显示帧率信息
adb shell setprop debug.sf.show_fps 1
adb shell setprop debug.sf.show_updates 1
3. 重启 SurfaceFlinger
adb shell stop surfaceflinger
adb shell start surfaceflinger
或重启整个系统:adb reboot
✅ 方法 B:详细合成日志
显示每一层的合成决策
adb shell setprop debug.sf.dump 1
adb shell setprop debug.sf.dump_protection 0
显示 VSYNC 详情
adb shell setprop debug.sf.vsync 1
三、HWC 日志开启(按平台)
✅ 通用属性(先试这个)
adb shell setprop debug.hwc.log 1
adb shell setprop debug.hwc.log_transactions 1
adb shell setprop debug.hwc.dump 1
✅ 高通平台(QCOM)车机
高通专用属性
adb shell setprop vendor.hwc.log debug
adb shell setprop vendor.hwc.log.level verbose
adb shell setprop vendor.display.log.level verbose
adb shell setprop vendor.display.enable_hwc_log 1
✅ 瑞芯微(Rockchip)车机
RK 平台
adb shell setprop vendor.hwc.log 1
adb shell setprop debug.drm.direct_show 1
adb shell setprop sys.rk.display.log 1
内核层日志(需 root)
adb shell "echo 8 > /sys/module/drm/parameters/debug"
✅ 全志(Allwinner)车机
adb shell setprop debug.sunxi.hwc.log 1
adb shell setprop debug.sunxi.disp.log 1
✅ 联发科(MTK)车机
adb shell setprop vendor.mtk.hwc.log 1
adb shell setprop vendor.mtk.debug.hwc 1
adb shell setprop vendor.mtk.sf.log 1
✅ 华为海思(HiSilicon)车机
常见于华为 HiCar 车机
adb shell setprop vendor.hisi.hwc.log 1
adb shell setprop debug.hisi.composer.log 1
adb shell setprop debug.hisi.disp.log 1
四、一键开启脚本(保存为 enable_car_logs.sh)
#!/bin/bash
车机 SurfaceFlinger & HWC 日志一键开启
echo "=== 车机显示日志开启工具 ==="
1. 检查连接
adb devices | grep -q "device$"
if [ $? -ne 0 ]; then
echo "错误:未检测到 adb 设备"
exit 1
fi
2. 获取 root
echo "获取 root 权限..."
adb root
sleep 2
3. 获取平台信息
PLATFORM=$(adb shell getprop ro.board.platform 2>/dev/null | tr -d '\r')
echo "检测到平台: $PLATFORM"
4. 设置通用属性
echo "设置通用日志属性..."
adb shell setprop debug.sf.log 1
adb shell setprop debug.sf.log_transactions 1
adb shell setprop debug.hwc.log 1
adb shell setprop debug.hwc.log_transactions 1
5. 按平台设置特定属性
case $PLATFORM in
qcom*|msm*|sm*)
echo "高通平台,设置 vendor 属性..."
adb shell setprop vendor.hwc.log debug
adb shell setprop vendor.display.log.level verbose
;;
rk*|rockchip*)
echo "瑞芯微平台..."
adb shell setprop vendor.hwc.log 1
adb shell setprop debug.drm.direct_show 1
;;
mt*|mtk*)
echo "联发科平台..."
adb shell setprop vendor.mtk.hwc.log 1
;;
hi*|hisilicon*)
echo "海思平台..."
adb shell setprop vendor.hisi.hwc.log 1
;;
*)
echo "未知平台,使用通用属性"
;;
esac
6. 重启 SurfaceFlinger
echo "重启 SurfaceFlinger..."
adb shell stop surfaceflinger
sleep 1
adb shell start surfaceflinger
sleep 3
7. 验证
echo "验证属性设置..."
adb shell getprop | grep -E "debug.(sf|hwc)|vendor.*(hwc|display)"
echo "完成!现在可以抓取日志:"
echo " adb logcat -s SurfaceFlinger,HWComposer -v threadtime"
使用方法:
chmod +x enable_car_logs.sh
./enable_car_logs.sh
五、验证日志是否生效
✅ 1. 实时抓取日志
同时抓取 SF 和 HWC
adb logcat -s SurfaceFlinger,HWComposer -v threadtime
或保存到文件
adb logcat -s SurfaceFlinger,HWComposer -v threadtime > car_display_log.txt
✅ 2. 检查属性是否设置成功
adb shell getprop | grep -E "debug.(sf|hwc)|vendor.*log"
预期输出:
debug.sf.log\]: \[1
debug.hwc.log\]: \[1
vendor.hwc.log\]: \[debug
✅ 3. 使用 dumpsys 验证
查看 SurfaceFlinger 状态
adb shell dumpsys SurfaceFlinger | head -50
查看 HWC 状态
adb shell dumpsys SurfaceFlinger | grep -A 20 "HWComposer"
六、车机常见问题及解决
问题 解决方案
setprop 无权限 1. 确认 adb root 成功
- 车机可能禁用 root,联系厂商
重启后日志消失 属性是临时的,需修改系统文件
adb pull /system/build.prop → 添加属性 → adb push
仍无任何日志 ROM 可能彻底移除日志代码
使用替代方案:systrace 或 dumpsys
只有零星日志 提高日志级别:
setprop debug.hwc.log.level 7
七、如果所有方法都无效:替代方案
✅ 方案 1:systrace(100% 有效)
抓取显示相关 trace
python systrace.py gfx view sched freq idle -o car_trace.html
车机专用参数
python systrace.py sched freq idle am wm gfx view -o car_full.html
✅ 方案 2:dumpsys 定期监控
每 2 秒抓一次 SurfaceFlinger 状态
while true; do
adb shell dumpsys SurfaceFlinger | grep -E "layer|queued|visible"
sleep 2
done
✅ 方案 3:内核日志
查看 DRM/KMS 日志
adb shell dmesg | grep -iE "drm|hwc|display"
实时查看
adb shell cat /proc/kmsg | grep -i hwcomposer
八、车机厂商联系建议
如果以上方法都无效,可能是厂商深度定制。建议:
-
联系车机厂商技术支持,请求:
• eng 版本系统
• 开启显示日志的专用工具
• 调试接口文档
-
提供以下信息:
车型:XXX
车机型号:XXX
安卓版本:XXX
芯片平台:XXX
需求:开启 SurfaceFlinger/HWC 日志用于 HiCar 投屏调试
九、一句话总结
车机开启日志 = debug.sf.log=1 + debug.hwc.log=1 + 对应平台的 vendor.*.log=debug + 重启 SurfaceFlinger。
如果还不行,systrace 是你的终极武器。
如果你尝试后仍有问题,请提供:
- ✅ adb shell getprop ro.board.platform
- ✅ adb shell getprop | grep debug
- ✅ 车机品牌型号
我可以帮你定制该车型的专属方案。