diff --git a/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java b/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java index dce8cebf..0e28d341 100644 --- a/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java +++ b/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java @@ -250,7 +250,6 @@ public class ScriptEngineService { synchronized (mEngineLifecycleCallbacks) { mEngineLifecycleCallbacks.add(callback); } - } void unregisterCallback(ScriptEngineManager.EngineLifecycleCallback callback) { diff --git a/autojs/src/main/java/com/stardust/autojs/core/image/capture/ScreenCaptureRequester.java b/autojs/src/main/java/com/stardust/autojs/core/image/capture/ScreenCaptureRequester.java index 0e276a43..5107a948 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/image/capture/ScreenCaptureRequester.java +++ b/autojs/src/main/java/com/stardust/autojs/core/image/capture/ScreenCaptureRequester.java @@ -49,6 +49,7 @@ public interface ScreenCaptureRequester { return; if (mCallback != null) mCallback.onRequestResult(Activity.RESULT_CANCELED, null); + mCallback = null; } } diff --git a/autojs/src/main/java/com/stardust/autojs/core/looper/Loopers.java b/autojs/src/main/java/com/stardust/autojs/core/looper/Loopers.java index b44b6d1e..64d340b1 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/looper/Loopers.java +++ b/autojs/src/main/java/com/stardust/autojs/core/looper/Loopers.java @@ -173,6 +173,14 @@ public class Loopers implements MessageQueue.IdleHandler { public void recycle() { quitServantLooper(); mMainMessageQueue.removeIdleHandler(this); + mMainLooperQuitHandler = null; + mScriptRuntime = null; + mThreads = null; + mTimers = null; + mMainLooper = null; + mServantLooper = null; + mMainHandler = null; + mMainMessageQueue = null; removeThreadLocalValue(); } diff --git a/autojs/src/main/java/com/stardust/autojs/core/opencv/Mat.java b/autojs/src/main/java/com/stardust/autojs/core/opencv/Mat.java index 7a9e74be..4c4e9c3d 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/opencv/Mat.java +++ b/autojs/src/main/java/com/stardust/autojs/core/opencv/Mat.java @@ -2,7 +2,6 @@ package com.stardust.autojs.core.opencv; import com.stardust.util.ResourceMonitor; -import org.mozilla.javascript.ScriptRuntime; import org.opencv.core.Range; import org.opencv.core.Rect; import org.opencv.core.Scalar; diff --git a/autojs/src/main/java/com/stardust/autojs/engine/JavaScriptEngine.java b/autojs/src/main/java/com/stardust/autojs/engine/JavaScriptEngine.java index 586ade0d..a6c8f80d 100644 --- a/autojs/src/main/java/com/stardust/autojs/engine/JavaScriptEngine.java +++ b/autojs/src/main/java/com/stardust/autojs/engine/JavaScriptEngine.java @@ -57,6 +57,7 @@ public abstract class JavaScriptEngine extends ScriptEngine.AbstractScriptEngine @Override public synchronized void destroy() { mRuntime.onExit(); + mExecArgv = null; super.destroy(); } diff --git a/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.kt b/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.kt index 9af22453..d32d9383 100644 --- a/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.kt +++ b/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.kt @@ -106,13 +106,13 @@ open class RhinoJavaScriptEngine(private val mAndroidContext: android.content.Co try { super.destroy() Log.d(LOG_TAG, "on destroy") - sContextEngineMap.remove(context) destroySuccess = true; } finally { if (destroySuccess) Log.d(LOG_TAG, "destroy execute success") else Log.d(LOG_TAG, "destroy execute failed") + sContextEngineMap.remove(context) Context.exit() } } diff --git a/autojs/src/main/java/com/stardust/autojs/execution/RunnableScriptExecution.java b/autojs/src/main/java/com/stardust/autojs/execution/RunnableScriptExecution.java index 6e35444e..000986fc 100644 --- a/autojs/src/main/java/com/stardust/autojs/execution/RunnableScriptExecution.java +++ b/autojs/src/main/java/com/stardust/autojs/execution/RunnableScriptExecution.java @@ -29,6 +29,9 @@ public class RunnableScriptExecution extends ScriptExecution.AbstractScriptExecu public void run() { ThreadCompat.currentThread().setName("ScriptThread-" + getId() + "[" + getSource() + "]"); execute(); + + mScriptEngine = null; + mScriptEngineManager = null; } public Object execute() { diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java b/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java index 4ba9954a..7dc9e397 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java @@ -427,6 +427,8 @@ public class ScriptRuntime { ignoresException(sensors::unregisterAll); ignoresException(timers::recycle); ignoresException(ui::recycle); + mTopLevelScope = null; + console.clear(); } private void ignoresException(Runnable r) { diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/Events.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/Events.java index ff0fbc91..1d9d813b 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/Events.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/Events.java @@ -285,12 +285,14 @@ public class Events extends EventEmitter implements OnKeyListener, TouchObserver } if (mListeningNotification) { mAccessibilityBridge.getNotificationObserver().removeNotificationListener(this); - mAccessibilityBridge.getNotificationObserver().removeToastListener(this); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2 && NotificationListenerService.Companion.getInstance() != null) { NotificationListenerService.Companion.getInstance().removeListener(this); } } + if (mListeningToast) { + mAccessibilityBridge.getNotificationObserver().removeToastListener(this); + } if (mKeyInterceptor != null) { AccessibilityService service = mAccessibilityBridge.getService(); if (service != null) { @@ -304,12 +306,23 @@ public class Events extends EventEmitter implements OnKeyListener, TouchObserver service.getGestureEventDispatcher().removeListener(this); } } + if (mLoopers != null) { + mLoopers = null; + } + if (mScriptRuntime != null) { + mScriptRuntime = null; + } + if (mBridges != null) { + mBridges = null; + removeAllListeners(); + } } @Override public void onKeyEvent(final int keyCode, final KeyEvent event) { mHandler.post(() -> { - String keyName = KeyEvent.keyCodeToString(keyCode).substring(8).toLowerCase(); + String keyString = KeyEvent.keyCodeToString(keyCode); + String keyName = keyString.startsWith("KEYCODE_") ? keyString.substring(8).toLowerCase() : keyString; emit(keyName, event); if (event.getAction() == KeyEvent.ACTION_DOWN) { emit(PREFIX_KEY_DOWN + keyName, event); diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/Images.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/Images.java index 8c5a4e96..322a8238 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/Images.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/Images.java @@ -267,6 +267,7 @@ public class Images { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && mScreenCapturer != null) { mScreenCapturer.release(); } + mScriptRuntime = null; } public Point findImage(ImageWrapper image, ImageWrapper template) {