From d1470346f3a59be1a745eb195e0120e0a2f14bdb Mon Sep 17 00:00:00 2001 From: SuperMonster003 Date: Wed, 19 Nov 2025 13:55:14 +0800 Subject: [PATCH] =?UTF-8?q?6.7.0=20-=20Alpha11=20-=20=E6=96=B0=E5=A2=9E=20?= =?UTF-8?q?crash=20=E5=85=A8=E5=B1=80=E6=96=B9=E6=B3=95,=20=E7=94=A8?= =?UTF-8?q?=E4=BA=8E=E6=B5=8B=E8=AF=95=E5=B4=A9=E6=BA=83=E6=8A=A5=E5=91=8A?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .changelog/lang_zh-Hans.json | 1 + .../autojs/engine/JavaScriptEngine.java | 2 ++ .../autojs/engine/RhinoJavaScriptEngine.kt | 1 + .../autojs/tool/CrashHandlerTestFunction.kt | 30 +++++++++++++++++++ 4 files changed, 34 insertions(+) create mode 100644 app/src/main/java/org/autojs/autojs/tool/CrashHandlerTestFunction.kt diff --git a/.changelog/lang_zh-Hans.json b/.changelog/lang_zh-Hans.json index 9dce139b..f35ee96b 100644 --- a/.changelog/lang_zh-Hans.json +++ b/.changelog/lang_zh-Hans.json @@ -19,6 +19,7 @@ "runtime.(set/is)JavaPrimitiveWrap 方法, 用于设置或获取 Java 原始类型包装策略 _[`issue #435`](http://issues.autojs6.com/435)_", "autojs.(restart/exit) 方法, 用于重启或退出 AutoJs6 应用, 并支持应用重启时自动运行其参数指定的脚本 _[`issue #460`](http://issues.autojs6.com/460)_", "UiObject#isShifted 方法, 用于检测控件位置变化", + "crash 全局方法, 用于测试崩溃报告页面", "structuredClone 全局方法, 用于深拷贝 JavaScript 对象 (参阅 [MDN](https://developer.mozilla.org/zh-CN/docs/Web/API/Window/structuredClone))", "设置页面增加 \"Java 原始类型包装\" 设置选项 _[`issue #435`](http://issues.autojs6.com/435)_", "设置页面增加 \"定时任务调度引擎\" 设置选项, 支持 AlarmManager/WorkManager/JobScheduler _[`issue #457`](http://issues.autojs6.com/457)_ _[`issue #388`](http://issues.autojs6.com/388)_ _[`issue #163`](http://issues.autojs6.com/163)_ _[`issue #53`](http://issues.autojs6.com/53)_ _[`issue #21`](http://issues.autojs6.com/21)_", diff --git a/app/src/main/java/org/autojs/autojs/engine/JavaScriptEngine.java b/app/src/main/java/org/autojs/autojs/engine/JavaScriptEngine.java index b29f7217..05e5e297 100644 --- a/app/src/main/java/org/autojs/autojs/engine/JavaScriptEngine.java +++ b/app/src/main/java/org/autojs/autojs/engine/JavaScriptEngine.java @@ -7,6 +7,7 @@ import org.autojs.autojs.runtime.ScriptRuntime; import org.autojs.autojs.runtime.api.augment.jsox.Jsox; import org.autojs.autojs.script.JavaScriptSource; import org.autojs.autojs.script.ScriptSource; +import org.autojs.autojs.tool.CrashHandlerTestFunction; import org.autojs.autojs6.R; import org.jetbrains.annotations.NotNull; @@ -45,6 +46,7 @@ public abstract class JavaScriptEngine extends ScriptEngine.AbstractScriptEngine mRuntime = runtime; mRuntime.engines.setCurrentEngine(this); put("runtime", runtime); + put("crash", new CrashHandlerTestFunction()); } public void emit(String eventName, Object... args) { diff --git a/app/src/main/java/org/autojs/autojs/engine/RhinoJavaScriptEngine.kt b/app/src/main/java/org/autojs/autojs/engine/RhinoJavaScriptEngine.kt index a346eaed..cba2b74c 100644 --- a/app/src/main/java/org/autojs/autojs/engine/RhinoJavaScriptEngine.kt +++ b/app/src/main/java/org/autojs/autojs/engine/RhinoJavaScriptEngine.kt @@ -94,6 +94,7 @@ open class RhinoJavaScriptEngine(private val androidContext: android.content.Con override fun forceStop() { Log.d(TAG, "forceStop: interrupt Thread: $thread") thread.interrupt() + runtime.cancelScriptJobs() } @Synchronized diff --git a/app/src/main/java/org/autojs/autojs/tool/CrashHandlerTestFunction.kt b/app/src/main/java/org/autojs/autojs/tool/CrashHandlerTestFunction.kt new file mode 100644 index 00000000..d91bbbc7 --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/tool/CrashHandlerTestFunction.kt @@ -0,0 +1,30 @@ +package org.autojs.autojs.tool + +import android.os.Handler +import android.os.Looper +import org.autojs.autojs.util.RhinoUtils.UNDEFINED +import org.mozilla.javascript.BaseFunction +import org.mozilla.javascript.Context +import org.mozilla.javascript.Scriptable +import org.mozilla.javascript.Undefined + +class CrashHandlerTestFunction : BaseFunction() { + + override fun call( + cx: Context?, + scope: Scriptable?, + thisObj: Scriptable?, + args: Array?, + ): Undefined { + val msg = if (!args.isNullOrEmpty()) Context.toString(args[0]) else "CrashHandler test" + Handler(Looper.getMainLooper()).post { + throw RuntimeException(msg) + } + return UNDEFINED + } + + override fun getArity(): Int = 1 + + override fun getFunctionName(): String = "crash" + +}