From 6fb6e14369589879fb308cdcae6e7b06aaab76fd Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Sun, 3 Dec 2017 14:13:34 +0800 Subject: [PATCH] add: module threads; read and write binary file supports --- app/build.gradle | 4 +- .../src/main/assets/javascript_engine_init.js | 1 + autojs/src/main/assets/modules/__engines__.js | 2 +- .../autojs/engine/JavaScriptEngine.java | 1 + .../autojs/engine/RhinoJavaScriptEngine.java | 2 +- .../autojs/runtime/ScriptRuntime.java | 6 ++ .../stardust/autojs/runtime/api/Engines.java | 11 +++ .../stardust/autojs/runtime/api/Threads.java | 80 +++++++++++++++++++ .../main/java/com/stardust/pio/PFiles.java | 58 +++++++++++++- .../stardust/pio/PRandomAccessBinaryFile.java | 4 + .../com/stardust/pio/PReadableBinaryFile.java | 9 ++- 11 files changed, 172 insertions(+), 6 deletions(-) create mode 100644 autojs/src/main/java/com/stardust/autojs/runtime/api/Threads.java diff --git a/app/build.gradle b/app/build.gradle index 68f0e579..02dbad2c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "com.stardust.scriptdroid" minSdkVersion 17 targetSdkVersion 23 - versionCode 227 - versionName "3.0.0 Alpha27" + versionCode 230 + versionName "3.0.0 Alpha30" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" multiDexEnabled true ndk { diff --git a/autojs/src/main/assets/javascript_engine_init.js b/autojs/src/main/assets/javascript_engine_init.js index 062f8a9f..1e8f7c57 100644 --- a/autojs/src/main/assets/javascript_engine_init.js +++ b/autojs/src/main/assets/javascript_engine_init.js @@ -49,6 +49,7 @@ var __that__ = this; var Promise = require('promise.js'); var JSON = require('__json2__.js'); var util = require('__util__.js'); +var threads = __runtime__.threads; var __asGlobal__ = function(obj, functions){ var len = functions.length; diff --git a/autojs/src/main/assets/modules/__engines__.js b/autojs/src/main/assets/modules/__engines__.js index b491308f..5157f06f 100644 --- a/autojs/src/main/assets/modules/__engines__.js +++ b/autojs/src/main/assets/modules/__engines__.js @@ -17,7 +17,7 @@ module.exports = function(__runtime__, scope){ } engines.myEngine = function(){ - return scope.__engine__; + return rtEngines.myEngine(); } engines.stopAll = rtEngines.stopAll.bind(rtEngines); 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 7b1f68a7..ffe960d5 100644 --- a/autojs/src/main/java/com/stardust/autojs/engine/JavaScriptEngine.java +++ b/autojs/src/main/java/com/stardust/autojs/engine/JavaScriptEngine.java @@ -32,6 +32,7 @@ public abstract class JavaScriptEngine extends ScriptEngine.AbstractScriptEngine throw new IllegalStateException("a runtime has been set"); } mRuntime = runtime; + mRuntime.engines.setCurrentEngine(this); put("__runtime__", runtime); } diff --git a/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.java b/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.java index 02ba6632..2b3853fe 100644 --- a/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.java +++ b/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.java @@ -144,7 +144,7 @@ public class RhinoJavaScriptEngine extends JavaScriptEngine { return importerTopLevel; } - protected Context createContext() { + public Context createContext() { if (!ContextFactory.hasExplicitGlobal()) { ContextFactory.initGlobal(new InterruptibleAndroidContextFactory(new File(mAndroidContext.getCacheDir(), "classes"))); } 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 b9e8c056..78da738d 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java @@ -16,6 +16,7 @@ import com.stardust.autojs.runtime.api.Console; import com.stardust.autojs.runtime.api.Engines; import com.stardust.autojs.runtime.api.Events; import com.stardust.autojs.runtime.api.Loopers; +import com.stardust.autojs.runtime.api.Threads; import com.stardust.autojs.runtime.api.Timers; import com.stardust.autojs.core.accessibility.UiSelector; import com.stardust.autojs.runtime.api.Images; @@ -146,6 +147,9 @@ public class ScriptRuntime { @ScriptVariable public final Engines engines; + @ScriptVariable + public final Threads threads; + private Images images; private static WeakReference applicationContext; @@ -172,6 +176,7 @@ public class ScriptRuntime { } engines = new Engines(builder.mEngineService); dialogs = new Dialogs(app, mUiHandler, bridges); + threads = new Threads(this); } public void init() { @@ -303,6 +308,7 @@ public class ScriptRuntime { } public void onExit() { + threads.shutDownAll(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { images.releaseScreenCapturer(); } diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/Engines.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/Engines.java index 8e74c45f..7b81a2c9 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/Engines.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/Engines.java @@ -1,10 +1,13 @@ package com.stardust.autojs.runtime.api; import com.stardust.autojs.ScriptEngineService; +import com.stardust.autojs.engine.JavaScriptEngine; +import com.stardust.autojs.engine.ScriptEngine; import com.stardust.autojs.execution.ExecutionConfig; import com.stardust.autojs.execution.ScriptExecution; import com.stardust.autojs.script.AutoFileSource; import com.stardust.autojs.script.JavaScriptFileSource; +import com.stardust.autojs.script.JavaScriptSource; import com.stardust.autojs.script.StringScriptSource; /** @@ -14,6 +17,7 @@ import com.stardust.autojs.script.StringScriptSource; public class Engines { private ScriptEngineService mEngineService; + private ScriptEngine mScriptEngine; public Engines(ScriptEngineService engineService) { mEngineService = engineService; @@ -40,4 +44,11 @@ public class Engines { } + public void setCurrentEngine(ScriptEngine engine) { + mScriptEngine = engine; + } + + public ScriptEngine myEngine() { + return mScriptEngine; + } } diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/Threads.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/Threads.java new file mode 100644 index 00000000..02c86874 --- /dev/null +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/Threads.java @@ -0,0 +1,80 @@ +package com.stardust.autojs.runtime.api; + +import com.stardust.autojs.engine.RhinoJavaScriptEngine; +import com.stardust.autojs.runtime.ScriptRuntime; +import com.stardust.autojs.runtime.exception.ScriptInterruptedException; +import com.stardust.concurrent.VolatileBox; +import com.stardust.concurrent.VolatileDispose; +import com.stardust.lang.ThreadCompat; +import com.stardust.pio.PFile; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentSkipListSet; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * Created by Stardust on 2017/12/3. + */ + +public class Threads { + + private List mThreads = new ArrayList<>(); + private ScriptRuntime mScriptRuntime; + + public Threads(ScriptRuntime scriptRuntime) { + mScriptRuntime = scriptRuntime; + } + + public void start(Runnable runnable) { + ThreadCompat threadCompat = new ThreadCompat(() -> { + try { + ((RhinoJavaScriptEngine) mScriptRuntime.engines.myEngine()).createContext(); + runnable.run(); + } catch (Exception e) { + if (!ScriptInterruptedException.causedByInterrupted(e)) { + mScriptRuntime.console.error(e); + } + } + }); + mThreads.add(threadCompat); + threadCompat.start(); + } + + public VolatileBox variable() { + return new VolatileBox(); + } + + public VolatileDispose disposable() { + return new VolatileDispose(); + } + + public List list() { + return Collections.synchronizedList(new ArrayList<>()); + } + + public Set set() { + return new ConcurrentSkipListSet(); + } + + public Map map() { + return new ConcurrentHashMap(); + } + + public AtomicInteger atomicInt() { + return new AtomicInteger(); + } + + public void shutDownAll() { + for (ThreadCompat threadCompat : mThreads) { + threadCompat.interrupt(); + } + mThreads.clear(); + } + + +} diff --git a/common/src/main/java/com/stardust/pio/PFiles.java b/common/src/main/java/com/stardust/pio/PFiles.java index bf7988a1..88c9d633 100644 --- a/common/src/main/java/com/stardust/pio/PFiles.java +++ b/common/src/main/java/com/stardust/pio/PFiles.java @@ -1,5 +1,6 @@ package com.stardust.pio; +import android.app.NativeActivity; import android.content.Context; import android.content.res.AssetManager; import android.os.Environment; @@ -10,10 +11,12 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; +import java.io.FileWriter; import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.io.RandomAccessFile; import java.nio.charset.Charset; import java.util.Locale; @@ -127,6 +130,16 @@ public class PFiles { return read(inputStream, "utf-8"); } + public static byte[] readBytes(InputStream is) { + try { + byte[] bytes = new byte[is.available()]; + is.read(bytes); + return bytes; + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + public static boolean copyRaw(Context context, int rawId, String path) { InputStream is = context.getResources().openRawResource(rawId); return copyStream(is, path); @@ -192,11 +205,54 @@ public class PFiles { public static void write(OutputStream outputStream, String text, String encoding) { try { outputStream.write(text.getBytes(encoding)); + outputStream.close(); } catch (IOException e) { throw new UncheckedIOException(e); } } + public static void append(String path, String text) { + try { + write(new FileOutputStream(path, true), text); + } catch (FileNotFoundException e) { + throw new UncheckedIOException(e); + } + } + + + public static void append(String path, String text, String encoding) { + try { + write(new FileOutputStream(path, true), text, encoding); + } catch (FileNotFoundException e) { + throw new UncheckedIOException(e); + } + } + + public static void writeBytes(OutputStream outputStream, byte[] bytes) { + try { + outputStream.write(bytes); + outputStream.close(); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + + public static void appendBytes(String path, byte[] bytes) { + try { + writeBytes(new FileOutputStream(path, true), bytes); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + + public static void writeBytes(String path, byte[] bytes) { + try { + writeBytes(new FileOutputStream(path), bytes); + } catch (FileNotFoundException e) { + throw new UncheckedIOException(e); + } + } + public static boolean copy(String pathFrom, String pathTo) { try { return copyStream(new FileInputStream(pathFrom), pathTo); @@ -357,7 +413,7 @@ public class PFiles { public static String getSimplifiedPath(String path) { if (path.startsWith(Environment.getExternalStorageDirectory().getPath())) { - return path.substring(Environment.getExternalStorageDirectory().getPath().length()); + return path.substring(Environment.getExternalStorageDirectory().getPath().length()); } return path; } diff --git a/common/src/main/java/com/stardust/pio/PRandomAccessBinaryFile.java b/common/src/main/java/com/stardust/pio/PRandomAccessBinaryFile.java index e1c621cd..f75b232e 100644 --- a/common/src/main/java/com/stardust/pio/PRandomAccessBinaryFile.java +++ b/common/src/main/java/com/stardust/pio/PRandomAccessBinaryFile.java @@ -5,6 +5,8 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; +import java.util.ArrayList; +import java.util.List; /** * Created by Stardust on 2017/4/29. @@ -29,4 +31,6 @@ public class PRandomAccessBinaryFile extends RandomAccessFile { + + } diff --git a/common/src/main/java/com/stardust/pio/PReadableBinaryFile.java b/common/src/main/java/com/stardust/pio/PReadableBinaryFile.java index 0498c438..92361a41 100644 --- a/common/src/main/java/com/stardust/pio/PReadableBinaryFile.java +++ b/common/src/main/java/com/stardust/pio/PReadableBinaryFile.java @@ -1,10 +1,17 @@ package com.stardust.pio; +import java.io.Closeable; +import java.io.IOException; + /** * Created by Stardust on 2017/4/6. */ -public class PReadableBinaryFile extends PFiles { +public class PReadableBinaryFile implements Closeable { + @Override + public void close() throws IOException { + + } }