6.7.0 - Alpha18 - 内置模块 (dayjs/cheerio/dayjs/i18n) 脱离脚本执行模式, 使用全局懒加载方式替代

This commit is contained in:
SuperMonster003
2026-01-24 20:44:06 +08:00
parent 10a3a8eec0
commit 10d09d3fa0
6 changed files with 31 additions and 78 deletions

View File

@@ -27,15 +27,10 @@ import java.text.MessageFormat;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static org.autojs.autojs.script.JavaScriptSource.EXECUTION_MODES;
import static org.autojs.autojs.script.JavaScriptSource.EXECUTION_MODE_MODULE_AXIOS;
import static org.autojs.autojs.script.JavaScriptSource.EXECUTION_MODE_MODULE_CHEERIO;
import static org.autojs.autojs.script.JavaScriptSource.EXECUTION_MODE_MODULE_DAYJS;
import static org.autojs.autojs.script.JavaScriptSource.EXECUTION_MODE_MODULE_I18N;
/**
* Created by Stardust on Jan 23, 2017.
@@ -44,12 +39,6 @@ public class ScriptEngineService {
private static final String TAG = ScriptEngineService.class.getSimpleName();
public static final List<Integer> GLOBAL_MODULES = List.of(
EXECUTION_MODE_MODULE_AXIOS,
EXECUTION_MODE_MODULE_CHEERIO,
EXECUTION_MODE_MODULE_DAYJS,
EXECUTION_MODE_MODULE_I18N);
private static ScriptEngineService sInstance;
private final Context mApplicationContext;
private final Console mGlobalConsole;
@@ -160,7 +149,6 @@ public class ScriptEngineService {
}
ScriptSource source = task.getSource();
if (source instanceof JavaScriptSource src) {
GLOBAL_MODULES.forEach((mode) -> handleGlobalModuleExecution(src, mode, getModuleNameFromMode(mode)));
int mode = src.getExecutionMode();
if ((mode & JavaScriptSource.EXECUTION_MODE_UI) != 0) {
return ScriptExecuteActivity.execute(mApplicationContext, mScriptEngineManager, task);
@@ -187,15 +175,6 @@ public class ScriptEngineService {
.orElse(null);
}
private void handleGlobalModuleExecution(JavaScriptSource source, int executionMode, @Nullable String moduleName) {
if (moduleName == null) return;
if ((source.getExecutionMode() & executionMode) != 0) {
mScriptEngineManager.putGlobal(moduleName, new ScriptModuleIdentifier(moduleName));
} else {
mScriptEngineManager.removeGlobal(moduleName);
}
}
public ScriptExecution execute(ScriptSource source, ScriptExecutionListener listener, ExecutionConfig config) {
return execute(new ScriptExecutionTask(source, listener, config));
}
@@ -298,14 +277,4 @@ public class ScriptEngineService {
}
public static class ScriptModuleIdentifier {
public String moduleFileName;
public ScriptModuleIdentifier(String moduleFileName) {
this.moduleFileName = moduleFileName;
}
}
}

View File

@@ -18,9 +18,7 @@ import org.autojs.autojs.core.console.GlobalConsole
import org.autojs.autojs.core.image.capture.ScreenCaptureRequester
import org.autojs.autojs.core.looper.Loopers
import org.autojs.autojs.core.pref.Pref
import org.autojs.autojs.engine.ScriptEngineService
import org.autojs.autojs.rhino.extension.ScriptableExtensions.defineProp
import org.autojs.autojs.rhino.extension.ScriptableExtensions.deleteProp
import org.autojs.autojs.rhino.extension.ScriptableExtensions.prop
import org.autojs.autojs.lang.ThreadCompat
import org.autojs.autojs.pio.PFiles
@@ -123,7 +121,6 @@ import org.mozilla.javascript.Scriptable
import org.mozilla.javascript.ScriptableObject
import org.mozilla.javascript.ScriptableObject.PERMANENT
import org.mozilla.javascript.ScriptableObject.READONLY
import org.mozilla.javascript.Wrapper
import java.io.File
import java.io.FileFilter
import java.io.IOException
@@ -180,7 +177,7 @@ import org.autojs.autojs.runtime.api.augment.util.VersionCodes as UtilVersionCod
* Modified by SuperMonster003 as of Dec 29, 2025.
* Transformed by SuperMonster003 on May 24, 2024.
*/
@Suppress("unused", "PropertyName", "PrivatePropertyName")
@Suppress("unused", "PropertyName")
class ScriptRuntime private constructor(builder: Builder) {
private val mJob = SupervisorJob()
@@ -407,12 +404,12 @@ class ScriptRuntime private constructor(builder: Builder) {
// @Commented by SuperMonster003 on May 24, 2022.
// ! Use internal Rhino JSON for better performance and compatibility.
// ! zh-CN: 使用 Rhino 内置的 JSON 以获得更好的性能及兼容性.
// val js_JSON by lazy { rhinoRequire("json2") as ScriptableObject }
// internal val js_JSON by lazy { rhinoRequire("json2") as ScriptableObject }
// @Commented by SuperMonster003 on May 26, 2024.
// ! Already implemented in Rhino 1.7.15 .
// ! zh-CN: 已在 Rhino 1.7.15 中实现.
// val js_polyfill by lazy { rhinoRequire("polyfill") as ScriptableObject }
// internal val js_polyfill by lazy { rhinoRequire("polyfill") as ScriptableObject }
/**
* @Hint by SuperMonster003 on Apr 17, 2022.
@@ -441,23 +438,23 @@ class ScriptRuntime private constructor(builder: Builder) {
* Substitution of Promise.
* zh-CN: Promise 的替代方案.
*/
val js_Promise by lazy { rhinoRequire("promise") as BaseFunction }
internal val js_Promise by lazy { rhinoRequire("promise") as BaseFunction }
val js_ResultAdapter by lazy { rhinoRequire("result-adapter") as BaseFunction }
internal val js_ResultAdapter by lazy { rhinoRequire("result-adapter") as BaseFunction }
internal val js_UiExt by lazy { rhinoRequire("ui-ext") as BaseFunction }
internal val js_Module by lazy { rhinoRequire("jvm-npm") as ScriptableObject }
val js_UiExt by lazy { rhinoRequire("ui-ext") as BaseFunction }
internal val js_mod_axios by lazy { rhinoRequire("axios") as BaseFunction }
internal val js_mod_cheerio by lazy { rhinoRequire("cheerio") as ScriptableObject }
internal val js_mod_dayjs by lazy { rhinoRequire("dayjs") as BaseFunction }
internal val js_mod_i18n by lazy { rhinoRequire("i18n") as BaseFunction }
private val js_object_observe_lite_min by lazy { rhinoRequire("object-observe-lite.min") as BaseFunction }
internal val js_mod_continuation by lazy { rhinoRequire("continuation") as ScriptableObject }
internal val js_mod_internal by lazy { rhinoRequire("internal") as ScriptableObject }
private val js_array_observe_min by lazy { rhinoRequire("array-observe.min") as BaseFunction }
private val js_structured_clone by lazy { rhinoRequire("structured-clone.min") as BaseFunction }
private val js_mod_continuation by lazy { rhinoRequire("continuation") as ScriptableObject }
private val js_mod_internal by lazy { rhinoRequire("internal") as ScriptableObject }
private val js_Module by lazy { rhinoRequire("jvm-npm") as ScriptableObject }
internal val js_object_observe_lite_min by lazy { rhinoRequire("object-observe-lite.min") as BaseFunction }
internal val js_array_observe_min by lazy { rhinoRequire("array-observe.min") as BaseFunction }
internal val js_structured_clone by lazy { rhinoRequire("structured-clone.min") as BaseFunction }
init {
info = accessibilityBridge.infoProvider
@@ -500,7 +497,6 @@ class ScriptRuntime private constructor(builder: Builder) {
).let { ApiPlugins(mUiHandlerAppContext, it) }
augment(topLevelScope)
applyExecutionModules(topLevelScope)
applyInternalModules(topLevelScope)
}
@@ -817,20 +813,6 @@ class ScriptRuntime private constructor(builder: Builder) {
augmentedApp.defineProp(Autojs::class.java.simpleName.lowercase(), augmentedAutojs)
}
private fun applyExecutionModules(global: Scriptable) {
ScriptEngineService.GLOBAL_MODULES.forEach { moduleMode ->
val moduleName = ScriptEngineService.getModuleNameFromMode(moduleMode) ?: return@forEach
var module = global.prop(moduleName) ?: return@forEach
if (module is Wrapper) module = module.unwrap()
when (module) {
is ScriptEngineService.ScriptModuleIdentifier -> {
global.defineProp(moduleName, rhinoRequire(module.moduleFileName), PERMANENT)
}
else -> global.deleteProp(moduleName)
}
}
}
private fun applyInternalModules(global: Scriptable) {
js_object_assign(global, js_mod_internal)
}

View File

@@ -5,6 +5,10 @@ import io.github.g00fy2.versioncompare.Version
import org.autojs.autojs.annotation.RhinoFunctionBody
import org.autojs.autojs.annotation.RhinoRuntimeFunctionInterface
import org.autojs.autojs.core.automator.UiObject
import org.autojs.autojs.rhino.ArgumentGuards.Companion.component1
import org.autojs.autojs.rhino.ArgumentGuards.Companion.component2
import org.autojs.autojs.rhino.ArgumentGuards.Companion.component3
import org.autojs.autojs.rhino.ArgumentGuards.Companion.component4
import org.autojs.autojs.rhino.extension.AnyExtensions.isJsNullish
import org.autojs.autojs.rhino.extension.AnyExtensions.jsBrief
import org.autojs.autojs.rhino.extension.NumberExtensions.jsString
@@ -107,6 +111,10 @@ class Global(private val scriptRuntime: ScriptRuntime) : Augmentable(scriptRunti
override val selfAssignmentGetters = listOf<Pair<String, Supplier<Any?>>>(
"WIDTH" to Supplier { ScreenMetrics.deviceScreenWidth },
"HEIGHT" to Supplier { ScreenMetrics.deviceScreenHeight },
"axios" to Supplier { scriptRuntime.js_mod_axios },
"cheerio" to Supplier { scriptRuntime.js_mod_cheerio },
"dayjs" to Supplier { scriptRuntime.js_mod_dayjs },
"i18n" to Supplier { scriptRuntime.js_mod_i18n },
)
companion object {

View File

@@ -28,10 +28,6 @@ public abstract class JavaScriptSource extends ScriptSource {
public static final int EXECUTION_MODE_UI = 0x0001;
public static final int EXECUTION_MODE_AUTO = 0x0002;
public static final int EXECUTION_MODE_JSOX = 0x0004;
public static final int EXECUTION_MODE_MODULE_AXIOS = 0x0010;
public static final int EXECUTION_MODE_MODULE_CHEERIO = 0x0020;
public static final int EXECUTION_MODE_MODULE_DAYJS = 0x0040;
public static final int EXECUTION_MODE_MODULE_I18N = 0x0080;
private static final String LOG_TAG = "JavaScriptSource";
@@ -40,10 +36,6 @@ public abstract class JavaScriptSource extends ScriptSource {
.put("auto", EXECUTION_MODE_AUTO)
.put("jsox", EXECUTION_MODE_JSOX)
.put("x", EXECUTION_MODE_JSOX)
.put("axios", EXECUTION_MODE_MODULE_AXIOS)
.put("cheerio", EXECUTION_MODE_MODULE_CHEERIO)
.put("dayjs", EXECUTION_MODE_MODULE_DAYJS)
.put("i18n", EXECUTION_MODE_MODULE_I18N)
.build();
private static final int PARSING_MAX_TOKEN = 300;