HarmonyOS 真机验证链路:从 hdc list targets 到 /data/local/tmp 探针
HarmonyOS 真机验证链路从hdc list targets到/data/local/tmp探针做 HarmonyOS ArkTS 项目时很多“安装失败”“启动失败”“DevEco Run 卡住”的问题根因并不在业务代码。Project028桌面卡片工坊的开发过程中就反复遇到过页面刚改完、assembleHap已经通过但安装时提示 target 找不到或者推包阶段创建临时目录失败。这类问题如果直接回头改 ArkTS 页面很容易越修越偏。Project028 的处理方式是把真机/模拟器验证拆成一条固定前置链路先确认hdc连接再确认/data/local/tmp可写最后才安装 HAP、启动 Ability 和截图复核。为什么先查设备而不是先改代码HarmonyOS 的本地验证至少涉及三层状态工程构建状态assembleHap是否通过。设备连接状态hdc是否能找到并连接目标设备。设备临时目录状态安装包能否推送到/data/local/tmp。如果第二层或第三层异常业务代码再正确也装不上。Project028 里出现过类似报错Not match target founded, check connect-key please ExecuteCommand need connect-key?这些不是“页面写错了”而是当前 shell 找不到可用设备或者设备连接状态已经失效。对这种问题第一步应该是设备前置检查而不是回滚页面代码。第一步确认hdctarget先运行hdc list targets -v理想情况下输出里应该能看到一个Connected的设备或模拟器。如果返回空列表、[Empty]或者状态是Offline就先不要继续安装。本机模拟器常用的恢复命令是hdc tconn 127.0.0.1:5555 hdc list targets -v如果仍然没有设备就需要重新拉起 DevEco 模拟器。例如 Project028 常用的是nova 15 ProEmulator.exe -hvd nova 15 Pro这里的关键判断是只有hdc list targets -v能看到Connected后面的安装和截图才有意义。第二步确认/data/local/tmp可写hdc install通常需要把包推送到设备临时目录。设备连接存在不代表临时目录一定可写。Project028 后续把这一步固定成探针hdc shell rm -f /data/local/tmp/codex_write_probe; touch /data/local/tmp/codex_write_probe echo write_ok || echo write_failed; rm -f /data/local/tmp/codex_write_probe如果返回write_ok说明可以继续安装。如果没有返回write_ok或者出现 read-only、permission、tmp 创建失败一类问题就先修设备/模拟器状态。这一步看起来很小但能把很多误判挡在前面。尤其是连续调 UI、桌面 Form、后台提醒时模拟器或真机状态可能已经变了不能假设上一次可安装这一次就还可安装。第三步安装 HAP设备可见、tmp 可写后再安装 HAPhdc install -r entry\build\default\outputs\default\entry-default-signed.hap如果项目当前要验证的是本地运行和页面交互优先装 HAP。不要拿过期的根目录.app包去判断运行问题因为.app更偏 AGC 上传和发布链路可能不是刚刚构建出来的本地 HAP。Project028 把安装前置条件写成这样assembleHap通过。hdc list targets -v有Connected。/data/local/tmp探针返回write_ok。再执行hdc install -r。少任何一步都不要急着说“代码有问题”。第四步启动 Ability安装成功后再启动主 Abilityhdc shell aa start -a EntryAbility -b com.example.project028如果项目里有多个 Ability要确认abilityName和bundleName对得上。Project028 的 bundle 是com.example.project028启动后再看设备前台是否进入应用。对于 UI 修复、桌面 Form、提醒等任务仅仅安装成功还不够还需要进入目标页面验证交互。第五步截图或 UI 树复核本地开发里最常见的误区是“命令跑完就算验证完成”。但对前端和 HarmonyOS 应用来说很多问题只有屏幕上能看出来。Project028 的验证通常至少保留一种证据当前页面截图。UI 树或布局 JSON。通知栏截图。桌面服务卡片截图。AGC 审核附件或关键帧。比如修复卡片编辑页输入、桌面 Form 宽卡、主题同步、代理提醒时仅靠assembleHap通过是不够的。需要看到用户路径真的可走通首页打开。点击进入目标页。操作按钮有响应。保存后状态被消费。桌面或通知栏能看到系统能力结果。常见症状和处理方式下面是 Project028 开发中沉淀出来的判断表| 症状 | 优先判断 | 处理方式 ||---|---|---||hdc list targets为空 | 模拟器/真机未连接 |hdc tconn 127.0.0.1:5555或重启模拟器 || target 是Offline| 连接失效 | 断开重连必要时重启 DevEco 模拟器 || 推包时临时目录失败 |/data/local/tmp不可写 | 先跑写入探针失败则修设备状态 || HAP 安装成功但页面不是最新 | 装错包或启动旧进程 | 确认 HAP 路径必要时 force-stop 后重启 || release 包真机拒绝安装 | Profile 来源不适合本地调试 | 使用包含设备 UDID 的 debug Profile 包 |这个表的原则很简单先把环境层的问题排干净再讨论应用逻辑。为什么 release Profile 包不适合本地调试Project028 后期接入代理提醒能力时遇到过一个典型问题本地 HAP 已经包含新权限但真机安装被拒绝日志里出现类似untrusted source app with release profile distributionType: 1这说明问题不在 ArkTS 页面而在包的 Profile 来源和设备信任链。AGC 提交要用 release Profile真机调试则应该使用包含当前设备 UDID 的 debug Profile。因此验证链路要区分清楚本地调试debug Profile HAP 设备验证。AGC 提交release Profile .app 版本绑定和审核状态。不要把 release 包安装失败误判成页面功能失败。固定成项目规则同类 HarmonyOS 项目如果经常做设备验证可以把下面这组命令固化到团队文档hdc list targets -v hdc tconn 127.0.0.1:5555 hdc shell rm -f /data/local/tmp/codex_write_probe; touch /data/local/tmp/codex_write_probe echo write_ok || echo write_failed; rm -f /data/local/tmp/codex_write_probe hdc install -r entry\build\default\outputs\default\entry-default-signed.hap hdc shell aa start -a EntryAbility -b com.example.project028真正执行时不一定每次都需要重连模拟器但检查顺序最好固定。这样遇到失败时能很快知道问题停在哪一层。小结HarmonyOS 真机验证不是从hdc install开始而是从hdc list targets -v开始。先确认设备连接再确认/data/local/tmp可写再安装 HAP、启动 Ability、截图复核。这条链路的价值不是多跑几条命令而是把“环境问题”和“业务代码问题”分开。对桌面卡片、代理提醒、AGC 审核这类需要真实设备能力的项目来说这个边界尤其重要。HDC 预检是发布链路的一部分不是临时命令设备预检章节要强调一个观点hdc install失败时不要马上改代码。Project028 的真机验证经常涉及 debug Profile、代理提醒权限、Form 添加、系统备份等平台能力。任何一个问题都可能被设备连接、权限、临时目录写入或旧包缓存误导。因此 HDC 预检应该固定成每次验证前的动作。标准顺序是确认设备在线确认/data/local/tmp可写确认旧包状态安装再启动目标 Ability最后通过截图或日志验证功能。这样做的好处是错误归因更干净连接失败就是连接问题签名失败就是签名/Profile 问题运行异常才回到业务代码。hdc list targets -v hdc shell echo write_ok /data/local/tmp/project028_probe.txt cat /data/local/tmp/project028_probe.txt hdc install -r entry\build\default\outputs\default\entry-default-signed.hap尤其是代理提醒这类后台能力不能只看页面 Toast。Project028 的验证里需要同时看偏好数据中的systemReminderId、系统日志里的通知事件以及真机通知栏截图。这里的判断是发布类缺陷必须拿到平台证据否则很容易“本地以为修了审核仍然打回”。落地检查清单是否把 HDC 预检放在构建和安装之前。是否说明/data/local/tmp可写性为什么重要。是否区分安装失败、签名失败和运行失败。是否提醒平台能力需要真机证据不只看模拟器。是否覆盖真实命令和 Project028 的验证习惯。