一、前言

最近在做 飞凌 RK3568 + OpenHarmony 5.1 的板级调试时,我有一个很实际的需求:

设备每次开机后,自动把 HDC 的 TCP 调试模式打开。

一开始最容易想到的办法,是直接在系统里执行:

hdcd -t &

但实际看了 OpenHarmony 的 init 机制和 HDC 自带的 hdcd.cfg 之后会发现,更推荐的做法不是手工起一个 hdcd -t & 进程,而是通过 setparam persist.hdc.mode.tcp enable 让系统现有的 hdcd 服务自动切到 TCP 模式。
OpenHarmony 的 init 配置文件本身就是 JSON 格式,系统启动时会解析这些配置来执行 jobs 和启动 services;系统还会扫描 /system/etc/init/*.cfg/vendor/etc/init/*.cfg。(Gitee)


二、为什么不建议直接写 hdcd -t &

原因很简单,系统本来就已经内置了 hdcd 服务

从 OpenHarmony 官方 hdcd.cfg 可以看到:

  • 已经定义了一个名为 hdcd 的 service

  • 可执行文件路径就是 /system/bin/hdcd

  • 这个 service 采用 start-mode: "condition"

  • 默认是 "disabled" : 1

  • 当参数 persist.hdc.mode.tcp=enable 满足时,会执行:

    • stop hdcd

    • sleep 1

    • start hdcd (Gitee)

也就是说,系统早就给 HDC TCP 模式留好了正规入口
你如果再额外手工跑一个 hdcd -t &,就可能和系统原有的 hdcd 服务管理打架,出现重复启动、socket 冲突、状态不一致之类的问题。这个结论可以直接从官方 hdcd.cfg 的服务定义和条件 job 逻辑看出来。(Gitee)


三、正确思路

正确思路其实很简单:

开机时通过 init job 执行:

setparam persist.hdc.mode.tcp enable

因为官方 hdcd.cfg 里已经写明,只要 persist.hdc.mode.tcp=enable,就会触发对应的 condition job,自动重启 hdcd 服务,使其进入 TCP 模式。(Gitee)

另外,OpenHarmony 的 HDC 参数文件里,persist.hdc.mode.tcp 默认值就是 "disable";有的配置里 persist.hdc.mode.usb 默认也是 "disable",而 root 版本参数文件里 USB 默认可能是 "enable"。这也说明:TCP 调试不是默认就开的,需要你显式打开。 (Gitee)


四、实现方法

1. 新建一个 init 配置文件

例如新建:

/system/etc/init/jypmc10_hdc_tcp.cfg

文件内容如下:

{
    "jobs" : [{
            "name" : "post-init",
            "cmds" : [
                "setparam persist.hdc.mode.tcp enable"
            ]
        }
    ]
}

这段配置的意思是:

  • 在系统启动到 post-init 阶段时

  • 自动执行 setparam persist.hdc.mode.tcp enable

  • 然后系统现有的 hdcd.cfg 会根据这个参数变化,自动 stop/start hdcd

OpenHarmony 官方文档明确说明,init.cfg 是 JSON 格式,用来配置系统启动时需要执行的命令和服务;系统启动时 Init 会解析这些配置并执行。文档还明确列出了标准系统会扫描的目录,包括 /system/etc/init/*.cfg/vendor/etc/init/*.cfg。(Gitee)


2. 为什么选 post-init

因为 post-init 属于系统启动阶段里的标准 job 时机,适合放这种“系统起来后自动设置参数”的操作。
OpenHarmony 的 init 配置模型里,jobs 就是“启动时要执行的命令集合”,而且这是标准的启动配置入口。(Gitee)

对这个需求来说,post-init 已经够用了,不需要自己再造一个复杂 service。


五、这个文件放哪里

这里分两种情况。

方案 A:临时验证,直接放到系统现成目录

你可以先放到:

/system/etc/init/jypmc10_hdc_tcp.cfg

因为 OpenHarmony 标准系统启动时就会扫描 /system/etc/init/*.cfg。(Gitee)

方案 B:正式固化到产品镜像,放到 vendor 侧

更推荐的正式做法,是把这个配置固化到板级 vendor 配置里,例如:

/vendor/etc/init/xxx.cfg

因为官方文档同样明确说了,/vendor/etc/init/*.cfgvendors 定义的配置文件目录,适合做板级和产品级定制。(Gitee)

我的建议:

  • 调试阶段:先放 /system/etc/init/

  • 量产/长期使用:固化到 /vendor/etc/init/


六、操作步骤实战

方法 1:在板子上临时创建配置文件

cat > /system/etc/init/jypmc10_hdc_tcp.cfg <<'EOF'
{
    "jobs" : [{
            "name" : "post-init",
            "cmds" : [
                "setparam persist.hdc.mode.tcp enable"
            ]
        }
    ]
}
EOF

然后重启设备:

reboot

方法 2:从源码里固化

如果你是自己编译 OpenHarmony 镜像,那就把这个 cfg 文件放进源码对应的 init 安装目录,最终让它出现在:

/system/etc/init/

或者:

/vendor/etc/init/

OpenHarmony 文档里给了标准系统的安装示例,说明 .cfg 文件可以通过 ohos_prebuilt_etc(...) 安装到 relative_install_dir = "init" 目录下。(Gitee)


七、如何验证是否生效

1. 先看参数是否打开

param get persist.hdc.mode.tcp

如果返回:

enable

说明参数已经成功设置。


2. 看端口监听情况

如果你的 hdcd 已经切到 TCP 模式,可以再看监听端口,例如:

netstat -anp | grep hdcd

或者结合你们设备实际网络情况去看对应端口。


3. PC 端连接测试

例如板子 IP 是 192.168.50.199,那 PC 端可尝试:

hdc tconn 192.168.50.199:端口号

八、如果还想固定 TCP 端口

有些情况下你不仅想自动开启 TCP,还想固定监听端口。
那可以在 cfg 里再多加一条:

{
    "jobs" : [{
            "name" : "post-init",
            "cmds" : [
                "setparam persist.hdc.port 8710",
                "setparam persist.hdc.mode.tcp enable"
            ]
        }
    ]
}

HDC 的参数文件中本来就定义了 persist.hdc.mode.tcp 这类持久化参数;结合 OpenHarmony HDC 侧现成的参数体系,这种做法比手工拉起 hdcd -t & 更符合系统原生设计。(Gitee)


九、常见坑点

1. 不要修改系统现成的 hdcd.cfg

最好新建你自己的 cfg,比如:

/system/etc/init/jypmc10_hdc_tcp.cfg

这样不会影响系统原有 HDC 逻辑,后续排查问题也更清晰。

2. 不要把 init 的 cmds 当成 bash 脚本

initcmds 是受支持的 init 命令集合,不是完整 shell。
你这种需求只需要一条 setparam,非常适合直接写到 job 里。官方 init 配置文档也明确把 jobs 和 services 分开了。(Gitee)

3. /system 可能是只读分区

很多镜像里 /system 默认不可直接写。
这种情况下,建议从源码里固化到镜像,而不是在线直接 cat > /system/etc/init/...。这一点和具体镜像挂载策略有关,实机上请先确认。


十、结论

这次的最终结论其实很明确:

在 OpenHarmony 上,要实现开机自动启用 HDC TCP 调试,推荐做法不是执行 hdcd -t &,而是新增一个 init cfg,在 post-init 阶段执行:

setparam persist.hdc.mode.tcp enable

原因是:

  1. OpenHarmony 本身就通过 init 的 JSON 配置来管理启动命令和服务。(Gitee)

  2. 系统内置的 hdcd.cfg 已经写好了 persist.hdc.mode.tcp=enable 时自动重启 hdcd 的逻辑。(Gitee)

  3. 这样做比手工起一个 hdcd -t & 更稳定,也更符合 OpenHarmony 原生机制。(Gitee)


附:本文最终使用的最小可用配置

{
    "jobs" : [{
            "name" : "post-init",
            "cmds" : [
                "setparam persist.hdc.mode.tcp enable"
            ]
        }
    ]
}

如果你想,我还能继续帮你把这篇再加工成更像 CSDN 爆文风格的版本,比如加上:

  • 摘要

  • 关键词

  • 目录

  • 封面小标题

  • “踩坑记录”

  • “一键复现版命令汇总”

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐