鸿蒙开发环境Unix调试失败?90%卡在3个隐蔽配置
|
去年六月,凌晨两点十七分,DevEco Studio 的调试器弹出「Failed to connect to emulator」之后第三十七次自动重启 ADB,我左手按着 Ctrl+C 中断构建,右手把键盘上那个掉了半年的 Caps Lock 键往缝隙里怼了怼——它早就没触点,但留着当指压板用。 不是模拟器崩了,是 Unix 调试通道根本没搭起来。你 run 一个空页面,它卡在「Waiting for device…」,logcat 里连一条 `devicemanage` 初始化日志都没有;你 killall adb、重装 platform-tools、换 root 用户跑、改 /etc/hosts 绑定 127.0.0.1 到 localhost——全没用。直到后半夜三点零四分,我在 build-cache 目录里扒拉出那条被 logrotate 吞掉的 `hdc_std.log`,翻到第 182 行:`[ERROR] auth failed: invalid sig, expect sha256(blah) got sha256(blah)`。就这行字,卡了我三天半。 会议室的白板没擦干净,上周画的 HarmonyOS SDK 分层图还粘着三道蓝白荧光笔印,底下压着一张手写的设备证书生成流程——被谁拿红笔圈出三处:`hdc list targets` 之前没配 `hdc_std --init`、`~/.hdc/` 权限设成了 755(必须是 700)、`devtools_adb` 插件在 IDE 设置里勾了却没重启 DevEco Studio。没人提,没人写文档,也没人 push 过对应 issue,因为所有报错都折叠在「Device connection timeout」背后,就像你 debug 时从不展开 `PromiseRejectionEvent` 的 `detail` 字段。 有人端着杯子站了很久,在工位隔断边听我们吼「能不能先确认下签名是不是用的 debug.keystore」,说完转身去接水,水声哗啦啦,椅子腿在水泥地上拖出半米长的刮痕。后端接口又变了,这次是把 `openId` 改成 `open_id`,但调试通了之后才发现鸿蒙真机上 requestHeader 里的 `User-Agent` 默认带了个空格,`"HarmonyOS/4.0 (Linux; U; Android 12; zh-CN; VOG-AL10) "`——末尾那个空格让 nginx 侧的 WAF 直接 return 403,控制台只显示 `net::ERR_CONNECTION_REFUSED`,连 status code 都不给你看。
文章配图,仅供参考 第二个坑是 `/etc/security/limits.conf` 里缺了 ` soft nofile 65536`。不配?`hdc shell` 连上后最多活 42 秒,然后 `Connection closed by remote host`。你 grep 全盘也找不到这句提示在哪抛的,它藏在 libhdc.so 的 epoll_wait 超时分支里,日志输出前就被 stderr buffer 给截断了。上次我是在 `/tmp/hdc_stderr_XXXX` 里翻到的,文件名带时间戳,但权限是 600,得 su 才能 cat。第三个更阴:华为开发者联盟下载的 `hdc` 工具链默认走的是 `~/.hdc/config.json`,但 DevEco Studio 自己会悄悄生成一份 `~/.config/DevecoStudio/hdc/config.json`,且不 merge。你改了前者,IDE 还读后者。有次我硬核 diff 两个 config,发现后者多了 `"useEmulator": false` 但没写进 UI 设置项——它就在那个灰色 disable 状态里,像设计稿标注漏标了圆角半径一样自然。工位的显示器是竖着的,我查这个 bug 时把终端窗口拉满屏,眼珠子追着两份 JSON 的 `auth`、`cert`、`port` 字段来回扫,扫到太阳穴突突跳。 外卖到了没人去拿,塑料袋搁在门口铁架上,汤渍慢慢洇开,渗进地面缝里。我盯着 `adb devices` 返回空,突然想起某次提交记录:#c2a9f3d,`fix: hdc init order in bash_profile`。作者不是我们组的,是西安团队,commit message 只写了「修复 Ubuntu 22.04 下 hcp 协议握手失败」,连个复现步骤都没留。但那条 diff 我记住了:`.bashrc` 里必须 `export HDC_HOST=127.0.0.1`,不能写 localhost,哪怕 `/etc/hosts` 里映射好了也不行——`getaddrinfo()` 在某些 glibc 版本里对 localhost 做了额外 resolve,多一次 DNS 查询,而 hdc_std 的 socket connect timeout 是 300ms,稳稳超时。 不解释什么叫首屏、白屏、回流重绘,你比我清楚那些帧率掉到 12fps 时 performance 面板里 layout 事件怎么堆成山。也不说「技术选型」——选它是因为客户要求上架应用市场,不是因为我们信了「一次开发多端部署」这句标语。抱怨只落在动作上:产品经理临时加需求,要我当天下午三点前调通真机调试;设计给的图没有标注文字行高,结果 Text 组件 lineHeight 没对齐,但这是另一摊事;后端把 `/v2/user/profile` 接口返回字段从 snake_case 改成 camelCase,连 Swagger 文档都没同步,但这和 Unix 调试失败没关系。 冷眼看着那些刚装完 DevEco Studio 的新人,一上来就点「Run on Device」,弹窗里选中手机型号,点确定——然后等。他们不知道 `hdc start-server --debug` 要提前跑,不知道 `adb forward tcp:12345 tcp:12345` 这步被 IDE 隐藏在某个未触发的条件分支里,更不知道真机 USB 调试模式下的「仅充电」选项会悄悄禁用 hdc 协议通道,而手机状态栏根本不会变图标,只在 `hdc list targets` 里彻底消失。这不是 bug,是契约:你得自己拼出那个完整链路,少一环,它就不响。 下一步?我现在在 ~/.zshrc 里 alias hdc='hdc_std',删掉了所有 `hdc` 符号链接,确保每次敲命令都走 std 版本;再写个 pre-commit hook,校验 `~/.hdc/config.json` 和 `~/.config/DevecoStudio/hdc/config.json` 是否 md5 相同;至于那台 VOG-AL10 测试机——上周摔过一次,摄像头裂了,但 usb 调试依旧比模拟器稳。先跑一遍 `hdc_std --init -f`,等日志出来,再决定要不要把键盘上那个 Caps Lock 键彻底抠下来。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


