Android-SurfaceView-打开车机SurfaceFlinger和HWC的日志

车机开启 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 成功

  1. 车机可能禁用 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

八、车机厂商联系建议

如果以上方法都无效,可能是厂商深度定制。建议:

  1. 联系车机厂商技术支持,请求:

    • eng 版本系统

    • 开启显示日志的专用工具

    • 调试接口文档

  2. 提供以下信息:

    车型:XXX

    车机型号:XXX

    安卓版本:XXX

    芯片平台:XXX

    需求:开启 SurfaceFlinger/HWC 日志用于 HiCar 投屏调试

九、一句话总结

车机开启日志 = debug.sf.log=1 + debug.hwc.log=1 + 对应平台的 vendor.*.log=debug + 重启 SurfaceFlinger。

如果还不行,systrace 是你的终极武器。

如果你尝试后仍有问题,请提供:

  1. ✅ adb shell getprop ro.board.platform
  2. ✅ adb shell getprop | grep debug
  3. ✅ 车机品牌型号

我可以帮你定制该车型的专属方案。

相关推荐
Fate_I_C2 小时前
Android函数式编程代码规范文档
android·代码规范
安卓蓝牙Vincent3 小时前
Android BLE SDK 设计手册(一):一次参数改动,让我重新设计了整套架构
android·架构
angerdream3 小时前
Android手把手编写儿童手机远程监控App之广播开机自启动
android·android studio
su_ym81103 小时前
Android SELinux
android·selinux
阿巴斯甜3 小时前
Android中项目架构:
android
程序员陆业聪5 小时前
线上监控与防劣化:让启动优化成果不再回退 | Android启动优化系列(五·完结)
android
程序员陆业聪5 小时前
首帧渲染优化:从白屏到内容可见的最后一公里
android
AI玫瑰助手5 小时前
Python基础:字符串的常用内置方法(查找替换分割)
android·开发语言·python
xiangxiongfly9156 小时前
Android 使用WebSocket通信
android·websocket·网络协议·okhttp