AutoJs6 icon indicating copy to clipboard operation
AutoJs6 copied to clipboard

脚本停不下来,试了文档很多api都停不下来。有大佬知道为啥嘛

Open 5yurong opened this issue 5 months ago • 8 comments

除主线程外,另外还开启了两个子线程,以及代码中有使用几个while循环。不知道和这些是否有关系

方式一 const currentEngineId = engines.myEngine().id // 遍历所有正在运行的脚本 不是当前实例,则停止 engines.all().forEach(engine => { if (engine.id !== currentEngineId) { engine.forceStop() } }) sleep(1000) app.launch(backPackage) alert(msg) try { threads.shutDownAll() // 停止所有线程 engines.stopAll() // 停止当前脚本 exit() // 强制退出 } catch (e) { console.error(e) }

方式二 function forceBack(msg, cb) { const backPackage = app.getPackageName(testName) if (backPackage) { cb ? cb() : '' app.launch(backPackage) alert(msg) // 1. 停止其他脚本 const currentEngineId = engines.myEngine().id engines.all().forEach(engine => { if (engine.id !== currentEngineId) engine.forceStop() })

// 2. 关闭所有线程和定时器
threads.shutDownAll()
auto.service('stop')

// 3. 跳过弹窗阻塞(alert 会阻止 exit)
setTimeout(() => {
	exit()
}, 100)

// 4. 强制中断主线程
threads.currentThread().interrupt()
engines.myEngine().forceStop()

// 5. 终极手段:关闭 Auto.js 进程
shell('am force-stop org.autojs.autojs6', true)

} }

5yurong avatar Jun 30 '25 01:06 5yurong

代码内容似乎是如何实现强制停止脚本的替代方案. 希望可以提供导致上述问题 (脚本无法停止) 的代码片段, 以便据此定位和解决问题.

SuperMonster003 avatar Jul 01 '25 04:07 SuperMonster003

感谢回复!

大致代码片段如附件js

test_main.txt

index.txt

5yurong avatar Jul 01 '25 10:07 5yurong

我看到附件中的代码, 含有 class, async 等 JavaScript 关键字. 这不是 AutoJs6 可以直接运行的脚本代码. AutoJs6 使用的是 Rhino 引擎 (v1.8.1-SNAPSHOT) 解释并执行脚本代码, 目前还不支持上述关键字的使用.

你是将上述源码转换为 ES5 然后再使用 AutoJs6 运行吗.

SuperMonster003 avatar Jul 01 '25 15:07 SuperMonster003

是的,使用了Webpack打包,配置了Babel将ES6的语法转为了ES5

5yurong avatar Jul 02 '25 01:07 5yurong

ES6 转换为 ES5, 一般情况下是会将 async/await 转换为 Promise (如果事实情况并非如此, 可在反馈时进行强调). 这样的话, Promise 是第一个需要排查的地方 (尤其是 AutoJs6 将 Promise 的实现由原有的外部扩展模块支持替换为 Rhino 内置 Promise 支持). 当然还有其他可能需要排查的地方. 这些排查需要一些时间, 我尽量在 7 月 16 日前完成排查并提供获取到的线索.

期间如果希望提供更多资料或反馈 (如你的 Webpack 配置, 转换后的与 issue 相关的核心代码等), 欢迎随时提供.

SuperMonster003 avatar Jul 02 '25 09:07 SuperMonster003

如附件代码,可复现 停不掉脚本(包括上述的使用的forceBack方法 以及 Autojs6浮动按钮中的关闭按钮)

如你的回复,我已经删除了async await相关的使用,但仍然在调用接口之后 复现了脚本停不下的问题。

如图所示,代码101行直接调用launchDouyinAndHandlePermission()时,点击浮动按钮中的关闭按钮 或 使用的forceBack方法,脚本可正常停下。 然而若使用代码110行 getAgentInfoApi({}, suceess, fail),则会出现脚本停不下来的现象。

Image

Image

main.txt

main_douyin_v34.6.0.txt

webpack.config.txt

fetch.txt

index.txt

5yurong avatar Jul 03 '25 08:07 5yurong

感谢反馈, 这些信息对于快速定位问题十分有帮助.

Sent from my XQ-DQ72 using FastHub

SuperMonster003 avatar Jul 03 '25 08:07 SuperMonster003

一个简单的问题复现代码:

!function main() {
    http.get('https://github.com', {}, callback);
}();

function callback(res, err) {
    console.log('res: ' + res);
    console.log('err: ' + err);
    while (1) {
        console.log(new Date());
        sleep(1e3);
    }
}

可以看到, 是 http 模块相关方法 (get/post/postJson/request/...) 中回调参数方法体的代码执行后无法被强制停止.

测试了 Auto.js 4.x 以及 AutoX (v6), 均存在上述问题.

我需要继续研究此问题是否与事件循环/子线程/定时器等方面有关.

SuperMonster003 avatar Jul 23 '25 16:07 SuperMonster003