红米k60手机,运行一段时间以后,

15d14174ffa72ee302f8208ae6c3f177.png

​ 停止不了,

5430afa55c0db0d1d8944e0b66015517.png

​ 也无法继续开始,必须,关闭脚本重启才可以运行正常,深度分析一下这个问题,其他模型解决了非常多天了,一直解决不了问题,导致抢购流程经常卡死中间用到了ocr的技术,来回的停止开始几次,就会卡死,为什么

L-PPMT · 6 小时前

回答

Hamibot AI
1
· 6 小时前

这个问题在红米K60上反复出现,深度分析下来,核心原因在于脚本执行流程中出现了不可中断的阻塞操作,导致脚本引擎无法响应停止指令,同时伴随无障碍服务状态异常,最终表现为“停止不了,也无法继续开始”。结合你提到的OCR技术使用,把原因拆解为以下几点:


1. OCR 调用导致脚本线程阻塞,无法处理停止信号

Hamibot 的脚本停止机制依赖于在脚本执行间隙检查停止标志。如果你的脚本在循环中调用 OCR(如 images.ocr() 或插件提供的 OCR 接口),而 OCR 是同步阻塞操作,在识别过程中:

  • 脚本卡在 OCR 调用上,没有机会执行“检查是否停止”的代码。
  • 你点击停止按钮时,Hamibot 只是向脚本线程发送中断信号,但线程正在等待 OCR 返回结果,无法响应。
  • 结果就是“停止不了”,UI 上显示停止但脚本实际仍在运行(或僵死)。

解决方法

  • 在每次 OCR 调用前加入超时控制,避免无限等待。例如:
    // 文档地址 https://docs.hamibot.com/
    var img = images.captureScreen();
    var result = ocr.recognize(img, { timeout: 3000 }); // 设定超时
    
  • 在循环中主动加入停止检查,避免在阻塞函数中长时间停留(但 OCR 调用本身阻塞时无法检查,所以需要依赖超时)。
  • 降低 OCR 调用频率,例如用 sleep(1000) 在循环中给系统喘息时间,也让停止信号有机会被处理。

2. 无障碍服务(AccessibilityService)崩溃或卡死

高频的 OCR 识别往往伴随着大量截图和界面分析,这会持续消耗无障碍服务的资源。红米K60系统对后台服务有严格限制,当无障碍服务被频繁调用或内存吃紧时,系统可能:

  • 杀死无障碍服务,但 Hamibot 检测到服务断开后重新拉起,反复重启导致状态混乱。
  • 服务进程假死,虽然系统显示已开启,但无法响应操作,造成脚本无法继续执行,也无法正常停止。

表现为:停止按钮无效,重启脚本后无障碍服务重新绑定,一切恢复正常。

解决方法

  • 在脚本中加入无障碍服务状态检测,若发现服务异常则主动退出并提示重启。
  • 降低自动化操作密度,避免连续大量截图和 OCR,给无障碍服务恢复时间。
  • 在红米手机设置中,将 Hamibot 的“省电策略”设为无限制,并锁定后台,防止被系统清理。

3. 内存泄漏与资源耗尽

OCR 引擎在反复调用时可能产生内存泄漏,尤其是每次截图后未及时释放图片资源。当脚本运行一段时间后,可用内存不足,系统开始频繁回收,导致脚本进程卡死,停止命令自然无法送达。

解决方法

  • 在每次 OCR 或截图后,手动回收图片资源:
    // 文档地址 https://docs.hamibot.com/
    var img = images.captureScreen();
    var result = ocr.recognize(img);
    img.recycle(); // 释放内存
    
  • 避免在循环中创建大量临时变量,使用全局变量复用。
  • 监控脚本运行时的内存,如果发现持续增长,就是泄漏信号。

4. 脚本本身逻辑缺陷:循环无退出条件或死循环

“来回停止开始几次就卡死”说明脚本可能在某个循环中无法退出,比如:

  • 等待某个界面元素出现,但该元素永远未出现,且没有超时跳出。
  • 异常处理不当,导致流程进入不可控分支。
  • 停止信号被忽略,脚本继续执行新操作,与前端状态冲突,造成无法再次开始。

解决方法

  • 所有循环和等待操作必须加上最大超时时间,超时后抛出异常或跳回主流程。
  • 在关键位置增加 if (isStopped()) return; 检查,但注意如果代码卡在阻塞调用中,这个检查无效,所以优先解决阻塞问题。

总结:为什么必须重启脚本才能恢复?

因为脚本进程已经陷入不可恢复的阻塞或僵死状态,Hamibot 的停止动作只是修改了一个标志位,无法强制终止阻塞的线程。重启脚本会重新创建执行环境,清空所有状态,所以能恢复。

根治方案

  1. OCR 调用加超时,并确保每次调用都处于可中断的循环中。
  2. 释放图片资源,避免内存泄漏。
  3. 降低操作频率,给系统和服务恢复时间。
  4. 在红米K60上关闭神隐模式,允许 Hamibot 后台无限制运行
  5. 重构脚本逻辑,所有等待必须带超时,所有循环必须响应停止信号。

按这个思路调整,卡死问题会得到本质解决。

ℹ️ 内容由 AI 生成,可能不准确,请注意核实