简介:这是一套面向鸿蒙应用开发者的设备调试与终端交互工具集合,定位类似安卓平台上的调试桥工具,核心价值在于让开发者能够通过命令行方式连接鸿蒙终端、传输指令并获取设备反馈。工具包内含三十个独立文件,压缩后体积约为十四兆,文件类型覆盖可执行程序、配置文件、签名证书和多种辅助模块,其中可执行程序主要负责设备交互、资源处理、代码反汇编和接口生成等任务,配置文件则保存了鸿蒙应用与系统组件的结构定义,供打包校验和运行解析使用。对需要深入鸿蒙底层调试的开发者来说,这套工具能够支撑应用安装卸载、系统信息查看、应用打包签名、二进制代码分析与性能监控等实际场景,同时为跨设备分布式开发提供必要的命令行手段。目前已有三千八百三十四人学习下载,工具包内部结构完整,可帮助开发者在本地快速搭建鸿蒙设备调试环境,减少来回查找工具的时间成本。
1. 鸿蒙hdc工具包:为什么鸿蒙设备调试绕不开这套免费命令行工具
手上有一台鸿蒙开发板,或者一台升级到鸿蒙系统的手机,想装一个 HAP 安装包、拉一份崩溃日志、把设备里的截图取回电脑。没有命令行工具时,这些操作得在 IDE 里点菜单,一次两次还能忍,做批量调试或自动化时效率就完全被拖垮。鸿蒙hdc工具包就是解决这件事的官方命令行调试工具链:安装、卸载、shell、日志、文件传输一整套都收敛在命令行里,而且官方本身就是免费分发的,不需要去第三方下载站找什么绿色版、破解版。但这套工具第一次跑通并不算零门槛,很多人卡在同一个位置:文件拿到了,hdc 却连不上设备。问题往往不在设备,而在驱动、环境变量和后台服务进程这三件事没有理顺。这篇文章从拿到工具包开始,到配置环境、首连设备、常用命令和排障,按顺序做就能跑起来。
2. hdc 工具包的组成与选型:先弄清楚里面是什么再去下载
hdc 不是一个单独的 exe 文件那么简单。把它当成一组有依赖关系的组件来看,后面遇到问题时才能顺着链路快速定位。这章先把工具包里面是什么讲清楚,再说从哪下载、怎么选版本。
2.1 hdc 工具链的四个组成:客户端、服务端、设备端驱动与文档
第一层是客户端,也就是你敲的 hdc 命令本身。在 Windows 上它是 hdc.exe,在 macOS 和 Linux 上是同名的可执行二进制。它只负责解析你输入的子命令和参数,然后把请求转发给本机的服务进程,自己并不直接和设备通信。很多人误以为 hdc 是个单文件工具,拷到哪都能用,实际上少了它依赖的组件,命令会报缺库或直接闪退。
第二层是服务端,常被称作 hdc server。客户端首次运行时会自动把它拉起,常驻在后台,负责维护与一台或多台鸿蒙设备的连接会话。它监听本地一个端口,统一管理 USB 和 TCP 两种连接通道。这个后台进程的状态直接影响所有后续操作:server 卡死,hdc 命令就会长时间无响应;server 版本旧,新设备就握手失败。很多「玄学问题」最后都定位在它身上。
第三层是设备端的守护进程 daemon,鸿蒙系统出厂时内置。当插上 USB 或建立 TCP 连接时,本机 server 和设备端 daemon 完成握手,之后才能执行 shell 命令、安装应用、截图这些操作。第四层是驱动和文档:Windows 下如果没有鸿蒙设备的 USB 驱动,设备在系统设备管理器里会显示为带感叹号的未知设备,hdc 自然找不到它;官方分发的工具包里通常带有驱动目录和设备开发文档,装完工具最好看一眼设备管理器确认驱动就绪。
这条链路可以用一句话概括:你敲的 hdc 先到本机 server,再通过 USB 或 TCP 到设备端 daemon。这也解释了为什么拔掉设备后 hdc 命令依然能启动——server 进程还活着。排查问题时顺序就从下往上:先看设备端驱动和授权,再看本机 server 的状态,最后才怀疑命令本身写错了。
2.2 hdc 与 adb 的边界:哪些命令不能直接平替
从安卓 adb 转过来的开发者,很容易有一个惯性:把 hdc 当成 adb 改了个名字。这个判断一半对一半错。命令风格确实相似,list targets、install、uninstall、shell 这些子命令一眼就能认出同源关系;但具体行为上有不少差异,最典型的是包管理命令和系统日志体系。adb 的 pm install、am start 在鸿蒙设备上并不适用,鸿蒙自己的包管理命令是另一套;日志从 logcat 换成了 hilog 体系,过滤参数和输出格式都不一样。所以别把 adb 脚本直接改个命令名就扔上去跑,至少要完整执行一遍确认参数被识别。
下面是一份常用命令对照表,方便快速迁移。
| 目标 | 安卓 adb | 鸿蒙 hdc |
|---|---|---|
| 列出设备 | adb devices | hdc list targets |
| 安装应用 | adb install app.apk | hdc install app.hap |
| 卸载应用 | adb uninstall 包名 | hdc uninstall 包名 |
| 进入终端 | adb shell | hdc shell |
| 传文件到设备 | adb push 本地 远端 | hdc file send 本地 远端 |
| 拉取设备文件 | adb pull 远端 本地 | hdc file recv 远端 本地 |
| 抓取日志 | adb logcat | hdc hilog |
另一个新手容易忽略的点是网络连接方式。adb 用 connect 命令建立 TCP 会话,hdc 里对应的是 tconn 子命令,参数是 IP 加端口,例如 hdc tconn 192.168.1.100:5555。命令不通用时不用硬背,hdc help、hdc shell --help 都能查子命令用法,比对着备忘录敲靠谱。我在给团队做内部培训时经常强调一点:先分清设备和工具的关系,再记命令;如果把 hdc 当成 adb 的无脑平替,后面的排障会加倍痛苦。
2.3 下载渠道怎么选:免费版不等于第三方站点
标题里强调「免费下载」,这里必须说一句务实的话:官方本来就是免费分发的,不存在需要去第三方找破解版或绿色版的理由。常见的官方获取方式有三种,按推荐程度排序:第一种是随官方开发环境一起出现。安装鸿蒙应用开发的官方 IDE 类工具时,工具链目录里就带着 hdc,找到可执行文件后复制出来即可独立使用,这种方式版本与 IDE 绑定,通常和当前 SDK 匹配度最高。第二种是从官方开发者站点单独下载命令行工具页面,解压后得到工具包,适合不想装完整 IDE 只想拿命令行工具的人。
第三种则是各种网盘和下载站里流传的旧版本「免费工具包」。我不推荐走这条路,原因有两个:一是旧版本 hdc 与新版本系统握手协议不匹配,连上后很容易出现 device offline 或命令无响应;二是第三方下载站的安装包可能被二次打包,里面多出你不知道的组件,对于要接入内部工程链路的工具来说这是安全隐患。
下载完成后养成一个固定动作:先看 hdc version 记录版本号,再配置环境变量。遇到新设备时,优先使用与设备系统发布时间接近的较新版本,不要拿着两三年前的老文件硬试——这条是用血泪经验换来的。工具的版本匹配,比下载渠道的「快慢」更值得关注。
3. 本地环境搭建:从拿到压缩包到 hdc list targets 看到设备
环境搭建的完整顺序是:解压固定目录、配置 PATH、准备设备和驱动、连接验证。每一步都有容易忽略的细节,按这个顺序走,出错时也容易定位。
3.1 解压检查:先确认工具包结构再动手
拿到压缩包,常见格式是 zip 或 tar.gz。无论哪种,先解压到一个固定目录,不要直接解压到桌面或下载目录就完事。我一般会解压到 C:\tools\hdc(Windows)或 ~/tools/hdc(macOS、Linux),后续环境变量和脚本都依赖这个固定位置,路径里尽量别带中文和空格。
# Windows PowerShell 下解压 zip 包 Expand-Archive -Path .\hdc_tools.zip -DestinationPath C:\tools\hdc -Force # macOS / Linux 下解压 unzip hdc_tools.zip -d ~/tools/hdc # 解压后先看目录结构,确认可执行文件和驱动目录存在 ls -la ~/tools/hdc这里的关键动作是解压后先看目录结构,而不是急着去找 exe。不同时期发布的工具包内部布局不完全一致,有的把 hdc 放在根目录,有的放在 toolchains 子目录,有的压缩包自带驱动和文档。看一眼结构,确认 hdc 可执行文件的位置,顺便确认有没有驱动安装目录,后面配置 PATH 时心里有数。
参数说明:Expand-Archive 的 -Force 用于覆盖已有解压结果;unzip 的 -d 指定解压目标目录;ls -la 用于核对文件权限。macOS 或 Linux 下如果可执行文件缺少 x 权限,需要先执行 chmod +x 给执行权限,否则最后一步会被系统拒绝。
3.2 PATH 配置:Windows 和 macOS 下的最小操作
把工具解压到固定目录之后,下一步是让终端在任意路径下都能直接调用 hdc。Windows 上常见做法有两种:一种是在「系统属性 → 环境变量 → Path」里手动添加 C:\tools\hdc;另一种是用 setx 命令。我建议优先用手动方式,原因马上说明。
# Windows PowerShell:把 hdc 所在目录加入用户 Path setx PATH "%PATH%;C:\tools\hdc" # 重新打开 PowerShell 后验证 hdc versionsetx 有个坑:它会把当前 PATH 展开后写回,如果 PATH 长度已经接近上限,可能截断或覆盖原有内容,导致其他命令失效。稳妥做法是在环境变量编辑器里手动新增一条 C:\tools\hdc,而不是用 setx 操作整条 Path。macOS 的做法也是追加到 shell 配置文件,然后重新加载:
# macOS:写入 zsh 配置并立即生效 echo 'export PATH="$HOME/tools/hdc:$PATH"' >> ~/.zshrc source ~/.zshrc # 验证 hdc version这里用 $HOME/tools/hdc 而不是写死绝对路径,换机器、换用户后配置依然能用。注意我把工具目录加在 PATH 的最前面,避免被系统目录里其他同名命令遮蔽。如果这台机器之前装过别的 hdc,这个顺序尤其关键。验证时除了看版本号,还要确认实际调用的路径:
which hdc type hdcwhich 输出实际调用的路径,type 输出还会显示它是不是别名。如果 type 结果里有 alias 字样,说明 shell 配置把 hdc 指到了别处,先去掉别名的干扰再继续。
3.3 首连设备前的三个准备:开发者模式、USB 驱动、授权弹窗
排障经验里,十个 hdc 连不上设备,有九个是下面三个准备没做齐。第一个是设备端开发者模式与 USB 调试开关。鸿蒙设备上开发者选项默认隐藏,需要在「设置 → 关于本机」里连续点击版本号若干次,直到系统提示已进入开发者模式。然后进开发者选项,打开 USB 调试开关。不同系统版本的入口路径略有差异,但思路一致,都是先开启开发者模式再允许调试。
第二个是 USB 驱动,Windows 上最容易在这步翻车。用 USB 线把设备连到电脑后,打开设备管理器,看有没有带黄色感叹号的设备。如果有,说明驱动没装或装错。优先从官方开发环境安装目录里找驱动安装程序,或者手动指定驱动路径指向工具包内驱动目录。macOS 和 Linux 一般不需要单独装驱动,但要确认数据线有没有传输能力——有的线只能充电,插上去系统有反应,hdc 却永远离线。
第三个是设备端授权弹窗。第一次连接时,设备屏幕会弹出一个是否允许 USB 调试的授权框,需要点击允许,最好勾选总是允许。很多人线插好了、驱动也装好了,就是没看设备屏幕一眼,授权弹窗被晾在那,hdc 一直报 offline。这个细节值得记牢,它排在我个人踩坑记录的前三名。
3.4 连接验证:hdc kill 和 list targets 的标准顺序
准备做完,开始第一次连接。打开终端,按顺序执行三件事:杀掉可能残留的旧 server、列出设备、检查连接状态。
hdc kill hdc list targets先执行 hdc kill 很重要。如果之前用旧版本 hdc 连接过设备,server 进程还活着,新命令可能被旧 server 接管,导致状态混乱。kill 掉之后,下次任何 hdc 命令都会自动拉起新的 server。list targets 用于列出当前可见的设备,输出格式因版本而异,常见是每行一个设备,包含序列号或网络地址。如果输出为空,按第 4 章的排查清单逐项检查;如果输出了设备,记下第一列的序列号,多设备调试时会用到。
设备通过网线连到局域网,或者不方便插 USB 时,需要先用 tconn 建立 TCP 会话:
hdc tconn 192.168.1.100:5555 hdc list targets参数说明:tconn 后面跟设备 IP 和端口,端口以设备端调试服务配置为准,常见的有 5555、8888。连接成功后 list targets 里会出现 192.168.1.100:5555 格式的设备。这个模式要求网络互通,设备端调试端口处于监听状态。到这里环境就算跑通了,第 5 章的常用命令都可以在这个基础上直接使用。
4. 避坑手册:hdc 连不上设备的 5 个高频翻车点
以下五条是我在开发、测试现场反复见过的踩坑记录,每条按「现象 → 原因 → 解决」展开。排查时从上往下走,往往不用走到最后一条就能解决问题。
4.1 hdc list targets 输出为空
现象:命令执行后什么也没打印,连错误提示都没有,像是什么都没发生。这是新用户遇到最多的情况。
原因:最常见是 USB 驱动缺失,设备在系统设备管理器里显示为未知设备;其次是 USB 线根本不能传数据,只能充电;再次是设备端 USB 调试开关没开。
解决:打开设备管理器,确认设备项有没有黄色感叹号;换一根确定能传数据的线;确认设备端已开启 USB 调试。最后再执行一次 hdc kill,排除旧 server 的干扰。这个顺序覆盖了绝大多数空列表场景,不要一上来就怀疑工具包是坏的。
4.2 提示 device offline
现象:hdc list targets 能看到设备,但后面执行 install、shell 命令时都提示 offline,设备明明插着线。
原因:设备端授权弹窗没确认;本机 hdc 版本与设备系统不匹配;之前授权时勾选了「仅本次允许」,拔线重连后授权失效。在这三个原因里,授权弹窗没点是最常见的,其次才是版本错配。
解决:先看设备屏幕,把授权弹窗点掉并勾选总是允许;再对比 hdc 版本和设备系统版本,把本机 hdc 换成更新或更匹配的版本;最后重新插拔 USB。排查顺序建议是:设备屏幕 → 版本 → 线材,这样覆盖率高,也节省时间。
4.3 命令执行后长时间卡住
现象:敲了 hdc shell 或 hdc hilog,光标停在那里不动,没有报错也没有输出,像是死机一样。
原因:server 与设备端握手时没有返回。常见于多台设备同时在线却没指定目标,server 不知道把命令发给谁;另一种情况是 tconn 建立的 TCP 连接已经失效,但 server 还在等待它响应。
解决:先执行 hdc list targets 确认当前会话;如果有多台设备,在命令里用 -t 参数指定序列号,常见格式是 hdc -t 设备序列号 shell,参数具体位置以 hdc help 输出为准。如果是 TCP 连接失效,重新执行 hdc tconn 建立会话,或者直接 hdc kill 后重来。卡住时不要反复敲回车,先看会话列表再决定下一步。
4.4 脚本里报 command not found
现象:在终端里手动敲 hdc 一切正常,但写进 shell 脚本或自动化任务里执行时,却报 command not found。
原因:脚本运行时的 PATH 环境变量和交互式终端不一样。尤其通过定时任务、CI 运行器这类非交互进程启动时,PATH 往往是被精简过的,你手动配置的目录根本没被加载;还有一种情况是 hdc 被 shell 函数或别名遮蔽,脚本里调到的不是同一个可执行文件。
解决:脚本开头不要依赖 PATH,直接写 hdc 的绝对路径,或者先解析出绝对路径再调用。
# 脚本中固定使用绝对路径,避免 PATH 差异 HDC_BIN="$HOME/tools/hdc/hdc" "$HDC_BIN" version "$HDC_BIN" list targets这段逻辑说明:把 hdc 路径赋给一个变量,后续所有调用都用这个变量,脚本就与外部环境无关。如果确实需要在脚本里用相对命令名,那就在脚本开头显式 export PATH,而不是依赖交互式终端的配置。这个习惯能省掉大量 CI 排障时间。
4.5 文件传输总是中断
现象:hdc file recv 拉取设备文件,拉到一半报错,或者速度极慢;hdc file send 推送大文件时也经常失败。
原因:USB 枚举不稳定,文件过大超出了 server 默认缓冲能力;部分情况下是数据线质量差,长时间传输容易掉线。这两个原因经常叠加出现,很难一次性定位。
解决:大文件优先走 TCP 连接,先用 hdc tconn 建立局域网会话,再执行 file recv 或 file send;也可以把大文件切成小块分多次传。走 TCP 时注意设备别自动休眠,网络带宽要稳定。这个技巧对经常传日志包、视频文件的人特别有用。
5. 高频命令手册:装 HAP、抓 hilog、传文件一把梭
环境跑通之后,日常开发调试里真正高频的就是三组操作:安装卸载、日志抓取、截图与文件传输。下面把每一组的完整动作和参数细节展开。
5.1 安装与卸载:hdc install 的必带参数与包名误区
应用调试一天可能要装十几个新包,这个命令是使用频率最高的。基础用法如下。
# 安装 HAP 包 hdc install ./entry-default-signed.hap # 覆盖安装,保留应用数据 hdc install -r ./entry-default-signed.hap # 卸载应用,后面跟的是包名,不是文件路径 hdc uninstall com.example.demo参数说明:install 不带 -r 时,如果应用已存在会直接报错;带 -r 表示覆盖安装,配合调试周期频繁重装非常方便。但不要以为 -r 一定保留应用数据,关键数据还是先在设备内做备份。卸载命令后面跟的是 bundleName 包名,不是你在桌面看到的应用显示名。想知道包名,可以用 hdc shell bm dump 输出系统包管理信息,再拉到本地过滤。
常见误区是把 .apk 文件直接喂给 hdc install,系统会报格式错误。鸿蒙应用安装包是 .hap 格式,先确认手上文件类型。另外 HAP 路径如果带空格,命令里要用引号包住整个路径,否则会被解析成多个参数。路径问题在 Windows 上尤其明显,养成加引号的习惯能少踩很多坑。
5.2 日志抓取:hilog 过滤与导出到本地
调试崩溃和性能问题时,日志是主要依据。hdc 提供了直达 hilog 的通道,用法不算复杂。
# 实时看全部日志输出 hdc hilog # 过滤包含关键字的日志 hdc hilog -e "YourKeyword" # 把日志输出到本地文件 hdc hilog > ./device.log说明:hilog 是鸿蒙的日志系统,与安卓 logcat 体系不同,输出格式有自己的标签结构。hdc hilog 会持续输出,按 Ctrl+C 停止。用 -e 加过滤词时,匹配的是日志正文里出现的文本;不同系统版本的过滤语法略有差异,批量跑脚本之前先执行 hdc shell hilog -h 看当前版本的参数说明。重定向到本地文件时,日志会持续增长,建议用 grep 做二次过滤,或者配合定时任务做滚动保存,别让文件无限膨胀。
实际排查时,我习惯先放通日志跑一小段复现问题,再用关键字过滤缩小范围。拿到崩溃现场后,同时开两个终端,一个跑 hdc hilog,一个跑复现操作,能比事后翻日志更快定位问题。
5.3 截图与文件回传:snapshot_display 和 file recv 的配合
需要记录设备界面状态或收集现场数据时,截图加文件回传是最常用的组合。
# 在设备上截屏并保存到设备内目录 hdc shell snapshot_display -f /data/local/tmp/screen.png # 把设备文件拉回本地 hdc file recv /data/local/tmp/screen.png ./screen.png # 把本地文件推送到设备 hdc file send ./test.hap /data/local/tmp/说明:snapshot_display 是鸿蒙系统里常见的截屏命令,但不同系统版本可能改名或调整位置。执行报 command not found 时,先到设备上确认可用命令,例如 hdc shell ls /system/bin 后过滤 snapshot 关键字,或者看 hdc shell help 的输出。不要因为一个命令不通用就判定工具包有问题,设备系统版本的差异也会影响命令集合。
file recv 和 file send 是最常用的文件通道,支持单文件也支持目录。传大文件时按第 4.5 条的方法处理,先建立 TCP 会话再传输,避免 USB 长传掉线。目标目录必须存在,file send 前可以先用 hdc shell mkdir -p 创建目录,否则会报路径错误。
最后附一份速查表,可以直接贴到工位旁边。
| 目标 | 命令 | 备注 |
|---|---|---|
| 列出设备 | hdc list targets | 空列表查驱动与授权 |
| 安装 HAP | hdc install [-r] 文件.hap | -r 覆盖安装 |
| 卸载应用 | hdc uninstall 包名 | 包名用 bm dump 查 |
| 连网口设备 | hdc tconn IP:端口 | 端口设备端配置 |
| 实时日志 | hdc hilog | Ctrl+C 停止 |
| 过滤日志 | hdc hilog -e 关键字 | 语法随版本变化 |
| 截屏 | hdc shell snapshot_display -f 路径 | 命令随系统版本 |
| 拉取文件 | hdc file recv 远端 本地 | 大文件走 tconn |
| 推送文件 | hdc file send 本地 远端 | 目录要先存在 |
6. 把自动连接脚本写成固定套路
命令行工具跑通之后,下一步是把它沉淀成固定脚本,让连接、检查、安装这些动作一键完成。下面这个脚本是我个人常用的套路,适合日常批量装包和快速验证。
#!/usr/bin/env bash # 自动清理旧服务、连接设备并安装 HAP set -e HDC="$HOME/tools/hdc/hdc" HAP="$1" DEVICE="$2" # 可选,形如 192.168.1.100:5555 # 1. 清理旧 server,避免版本错配 "$HDC" kill 2>/dev/null || true # 2. 按需建立网络会话 if [ -n "$DEVICE" ]; then "$HDC" tconn "$DEVICE" fi # 3. 确认设备在线 "$HDC" list targets # 4. 安装应用 if [ -n "$HAP" ]; then "$HDC" install -r "$HAP" fi脚本逻辑分四段:第一段 kill 旧 server,保证后续调用拉起的是干净实例;第二段在传入设备地址时建立 TCP 会话;第三段 list targets 用于在输出里确认设备在线状态;第四段才执行安装。把安装放到最后,是为了让前面任何一步失败时都能在日志里看到明确报错,而不是被安装错误掩盖。
如果脚本要跑在定时任务或 CI 环境里,可以再加一段设备在线检查:
if ! "$HDC" list targets | grep -q "$DEVICE"; then echo "设备不在线,尝试重新连接" "$HDC" tconn "$DEVICE" sleep 2 fi这段的作用是:设备可能因为休眠或断网离线,脚本先检查一次,不在线才重新连接,避免每次都强行 tconn 导致会话冲突。路径统一用变量管理,换机器时只改 HDC 一行。
我此前有一阵子图省事,从第三方站点下了个「绿色版」hdc,结果连续两天被 device offline 反复折磨,最后发现是设备要求较新的握手协议,旧工具根本跑不了。从那以后我都从官方渠道获取工具包,把版本号记在脚本注释里,换设备时先验证兼容性再做自动化。把这个流程固定下来,之后基本没再翻过车。希望帮到你。
本文还有配套的精品资源,点击获取