当前 README.md 支持以下语言:
- 简体中文 [zh-Hans] # 当前
- 繁體中文 (香港) [zh-Hant-HK]
- 繁體中文 (台灣) [zh-Hant-TW]
- English [en]
- Français [fr]
- Español [es]
- 日本語 [ja]
- 한국어 [ko]
- Русский [ru]
- العربية [ar]
AutoJs6 Node.js Runtime 插件为 AutoJs6 提供内嵌 Node.js 24.21.0 原生运行时, 用于执行 Node.js 脚本和插件化运行时任务. 在 Android 17 及以上, 在 AutoJs6 插件中心开启此插件前需允许访问附近的设备. 也可在此插件的设置页面中管理本地网络权限. 未获授权时插件保持关闭, 自动启动将静默跳过. 此权限属于插件自身, 与 AutoJs6 的授权相互独立.
- 提供
nodejs插件服务, 插件 ID 为nodejs, 引擎为nodejs. - 通过
org.autojs.plugin.nodejs.RUNTIME为宿主提供同步脚本执行和运行时预热. - 支持覆盖排队与执行全过程的脚本超时, 超时返回
ERR_AUTOJS6_SCRIPT_TIMEOUT; 未指定超时时仍可无限运行 - 默认启用
dgram(UDP) 与http2, 并对trace_events返回明确的禁用错误 - 支持 Debug 构建显式开启本地
inspector调试, 仅监听 localhost 并通过adb forward连接 - 支持 CommonJS/ESM 源码, 模块源码, 工作目录, 沙盒根目录, 环境变量, stdout/stderr 结果回传.
- ESM 入口与 dynamic
import()使用 V8 native linker, 支持循环依赖、可变导出与 re-export live binding; CommonJSrequire(esm)保留同步互操作边界. - 提供由插件自身 Android 权限约束的桌面式文件系统访问;
/proc、/sys、/dev始终由运行时拒绝. - 执行宿主提供的 TypeScript 编译产物, 并可通过 provider v3 请求按需编译运行中创建的项目
.ts/.mts/.cts; 运行时类型剥离 fallback 与兼容开关已删除, direct raw dispatch 始终 fail-closed. - 提供宿主能力代理与 live bridge, 可注入
autojs6:host-app-info,autojs6:device-info,autojs6:engine-info,autojs6:lifecycle-config,autojs6:bridge-permissions等运行时模块. - 附带
sample/nodejs示例项目与docs/HOST-API.md宿主 API 能力清单. - 插件信息, 使用说明, README 与 CHANGELOG 均支持西班牙语/法语/俄语/阿拉伯语/日语/韩语/英语/简体中文/香港繁体/台湾繁体.
- 附带多入口终端启动器
libnodexe.so与 npm / corepack 资产, 通过NODE_CLI_*manifest meta-data 声明, 使 AutoJs6 终端 (宿主 6.8.0+) 能在自身 uid 的 shell 中运行node,npm,npx,corepack,yarn与pnpm.
"nodejs";
console.log(process.version);
console.log("AutoJs6 Node.js runtime");将插件安装并在 AutoJs6 插件中心启用后, 以 "nodejs"; 指令启动 Node.js 脚本. 更多示例位于 sample/nodejs.
- 怎么装 — 从 Releases 下载对应 ABI 的 APK (不确定就选
universal) 并安装; 或本地构建.\gradlew.bat :app:assembleDebug后安装app/build/outputs/apk/debug/下的产物. 然后在 AutoJs6 的插件中心启用本插件. Android 11+ 如需访问共享存储, 还要在系统设置中为本插件授予“所有文件访问”; 未授予时出现EACCES属预期行为. - 怎么跑 — 在 AutoJs6 编辑器中新建脚本, 首行写
"nodejs";, 其余按桌面 Node.js 写法编写 (支持 CommonJS/ESM/npm 纯 JS 包/网络内建模块), 点击运行即可. 运行中即时输出, 可随时手动停止. raw.ts/.mts/.cts当前必须先由宿主编译为 JavaScript; 插件不内置tsc. - 出错了看哪里 — 脚本报错时控制台显示 JS 栈与一行错误码 (如
ERR_AUTOJS6_NODE_SCRIPT_CANCELLED); 更多细节用adb logcat -s AutoJs6NodeBridge NodeJsRuntimePlugin查看插件进程日志. 宿主 API 可用性以docs/HOST-API.md为准.
- 运行时槽位:
node24_21. - 插件 ID:
nodejs, 引擎:nodejs. - 运行时服务动作:
org.autojs.plugin.nodejs.RUNTIME. - 原生运行库:
libnode.so,libautojs6-node.so和libnodexe.so. - Intl: ICU 78, 仅含英文区域数据 (
--with-intl=small-icu);Intl, 正则表达式的 Unicode 属性转义以及 Node 自身写到 stderr 的错误输出均可在 AutoJs6 终端中使用,NODE_ICU_DATA可指向完整的 ICU 数据文件. - ABI:
arm64-v8a,armeabi-v7a,x86_64, 以及universal. - 文件系统: Android 权限允许范围内可访问设备路径;
/proc、/sys、/dev为硬边界. - TypeScript: 接受宿主产物并可通过 provider v3 按需编译运行中创建的项目文件; direct raw TypeScript 返回
ERR_AUTOJS6_TYPESCRIPT_COMPILER_REQUIRED. - ESM linker:
vm.SourceTextModule/vm.SyntheticModule, 原生 live binding 与循环依赖. - 能力: 同步脚本执行, bundle transport, 原生内嵌运行时, 宿主能力代理, host capability live bridge.
- 文件流、gzip/deflate/Brotli 压缩流和基础 VM 执行正式化; 显式启用的 Debug Inspector 在 localhost 范围内正式支持.
- 嵌入执行不再输出 ExperimentalWarning 提示, 保留 warning 事件、普通警告、弃用警告和错误; Node 上游 API 稳定性与终端默认行为不变.
新增运行时槽进程发生 Node.js 致命错误 (JavaScript 堆内存耗尽、内部检查失败) 时, 现在会在插件缓存目录留下 Node 自带的诊断报告 (crash/.json, 于中止前写出, 不安装信号处理器): 失败结果在 slotExit.crash 与错误消息中带上事件、堆用量、JS 栈与报告路径 (例如 CRASH_NATIVE (SIGABRT; see the logcat tombstone; Node.js fatal error: Allocation failed - JavaScript heap out of memory; JS heap 61.9 MB used of 64.0 MB limit; report .../crash/.json)), getRuntimeInfo 以 lastCrash 暴露最新报告 (调度进程重启后仍可读); 新增请求选项 maxOldGenerationSizeMb 为单次执行设置 JS 堆上限 (V8 老生代, 单位 MB), 回归用例也借此复现该崩溃修复修复 require 大体积 CommonJS 模块时运行时槽进程因 V8 堆内存耗尽而中止 (回报为 CRASH_NATIVE / SIGABRT) 的问题: 加载器的注释与字符串掩码逐字符拼接, 22 MiB 模块需要约 700 MB 堆内存; 现改为按连续区段输出 (结果相同, 约 44 MB), CommonJS 的 import / export 扫描也改为在候选位置间跳转而非逐字符检测
修复runtimeInfo 报告的能力目录版本与摘要改由 runtime kit 派生, 修正 1.5.4 中仍为 1.5.0 的旧值修复worker_threads 按 Node 语义支持 new Worker(code, { eval: true }), 不再把代码字符串当作脚本路径优化TypeScript 宿主编译路由在能力目录中转为 stable, 删除已退役的 legacy stripping 元数据; 生命周期目录只保留可运行的执行模式, 移除 packaged_long_running 启动面与 node_sandboxed / worker_computation 保留名; 传输、准入与取消元数据按实际运行时对齐优化autojs6:profile 诊断对象按实际运行时描述, 不再沿用历史 partial / reserved / deferred 文案: Android 权限约束的文件访问、process 子集、worker 通道、进程池以及 WASI / native addon 决策优化样例清点: packaged-esm、packaged-dynamic-import、require-esm、wasm-basic、wasm-plugin 与 desktop-parity-suite 转为 stable; 两个 parity 套件改为真正逐条执行片段而非打印目录文案; compile-cache 标为不适用, 删除只打印元数据的 package-install 样例优化模块加载与 Node 一致地交给 Android 文件访问: require、import 与 Worker 接受绝对路径、上级目录目标与 file: URL (/proc、/sys、/dev 仍拒绝); node_modules 查找仍锚定工作区优化Worker 消息与 fs 监视器按 Node 原生限制运行: 移除 64 KB 消息与 32 条排队上限, 以及 16 个监视器 / 每秒 64 事件配额; 仅受 Android 内存约束优化worker 内 process.exit() 按 Node 语义只结束该 worker 线程, process.getBuiltinModule() 走 worker builtin 名单, 不再整体禁用优化worker 内 bare 包名按 Node 语义经工作区 node_modules 解析 (exports 条件、main、index、包自引用), 不再一律拒绝优化worker 内动态 import() 经 worker 的 partial ESM 装载器执行 (相对/绝对路径、file: URL、工作区包、builtin 名单、with { type: "json" }), 不再拒绝优化host-events 样例在实体按键与通知访问人工验收通过后转为 stable优化scheduled-node-task 样例打印生命周期策略并可保留定时任务供 WorkManager 实跑; scheduled 执行模式补齐插件侧回归优化scheduled 执行模式在宿主 WorkManager 定时运行器经插件实跑通过后, 能力目录状态转为 available优化media.play() 返回经宿主脚本音乐服务播放的会话对象 (pause/resume/seekTo/stop/status), 新增 media_store 模块提供受限的 MediaStore capabilities/query/get/insert/update/delete/scanFile/exportFile, 分别由 media.playback / media.library / media.library.mutate 能力把关; autojs6:compat.media 补上 Rhino 风格的 playMusic 等别名; 均需配套宿主构建优化media-playback / media-library 样例经宿主媒体 provider 合并后的人工验收转为 stable; 能力目录快照 1.5.5 发布到 releases/nodejs-capability-catalog, 宿主对齐任务改为对照该快照优化fs 包装层移除自设的选项拦截: 流的 fs / 继承的 fd / flags 选项、watch({ recursive: true })、异步 cp filter (cpSync 保持 Node 的 ERR_INVALID_RETURN_VALUE)、绝对路径 / 父目录 / 字面 '!' glob 模式与 exclude 数组、readableWebStream 的 type / encoding 以及 Stats / Dirent / Dir 构造器均按 Node 24 原生语义处理; filesystemProfile.advancedApis.recursiveWatch 报告 native优化递归 readdir / opendir 交给原生 (移除 4096 条目上限与逐条 realpath 校验; readdir('/') 与 Node 一样列出 proc/sys/dev 名称), readlink / chmod / chown / utimes 接受绝对路径且 chmod 跟随符号链接, fs 策略错误码收敛为 ERR_AUTOJS6_FS_NUL_BYTE / ERR_AUTOJS6_FS_PATH_ESCAPE (硬边界, 与 loader 一致) / ERR_AUTOJS6_FS_SCOPED_PATH, 普通 fs 失败只保留 Node 码优化运行时移除自设的模块源预算 (单模块 16 MiB、总量 64 MiB、8192 个模块、provider 请求计数), CommonJS 入口的 __filename / require.main.filename / process.argv[1] 与 Node 一样为绝对路径且 require.main.id 为 '.', fs.mkdtemp* 交给原生: 返回调用者的前缀写法加后缀并支持所请求的编码, 前缀父目录为符号链接时不再拒绝优化node:sqlite 把 SQL 文件操作交给原生 SQLite: 字面量文件名的 ATTACH (含 file: URI) 改经 SQLite authorizer 按 /proc、/sys、/dev 边界校验而不再扫描 SQL 文本, VACUUM INTO 的目标经 SQLite 内部 ATTACH 接受同一边界校验, 目录 PRAGMA 不再拦截, file: URI 字符串与空临时库可以打开, setAuthorizer() 与边界检查复合 (仅绑定参数或表达式给出文件名的 ATTACH 仍被拒绝)优化桥配额交给宿主: 超出 autojs6:bridge-limits 中 maxPendingBridgeCalls 窗口的调用改为按先进先出排队等待而不再以 ERR_AUTOJS6_BRIDGE_RESOURCE_LIMIT 失败, 运行时不再自行限制图像句柄数、受控 fetch 并发数与受控 WebSocket 连接数 (宿主 broker 继续执行其策略), require('fetch').policy.maxConcurrentRequests 与 require('websocket').policy.maxConnections 字段退役优化桥接 fetch / WebSocket / axios facade 的硬上限交给宿主: 超时、响应体大小、重定向次数、消息与队列尺寸及 HTTP 方法原样传给宿主提供者 (由宿主策略决定), 运行时像 Node 一样最多跟随 20 次重定向, policy 中退役的 hard* / 默认尺寸字段改为 limitsEnforcedBy优化opendir 直接返回 Node 原生的惰性 fs.Dir (bufferSize、encoding 与 recursive 交给原生 opendir, ENOENT / ENOTDIR / ERR_DIR_CLOSED 均为 Node 原生错误; 只有 dir.path 与 parentPath 保留调用者写法), 运行时删除文件系统可达根的守卫退役, 对根目录的 rm / rmdir 与其他路径一样交给 Node 与 Android 决定 (fs 策略码只剩 FS_NUL_BYTE 与 FS_PATH_ESCAPE)优化宿主 provider 传输通道改为采用宿主经 getNativeDiagnostics() 公布的单源 / 总量 / 请求计数尺寸 (内置的 16 MiB / 64 MiB / 139264 仅作回退), 桥接 fetch 的响应体改经文件描述符交付 (bodyTransport "pfd"), 只受宿主 maxResponseBytes 策略约束而不再受 Binder 事务尺寸限制, 宿主回复超过 Binder 事务尺寸时立即报 ERR_AUTOJS6_BRIDGE_PROVIDER_FAILED (宿主分支 node-m20-2-binder-body-pfd) 而非桥超时优化桥接 fetch 的请求正文与 WebSocket 消息超过 256 KiB 时改以只读文件描述符 (bodyTransport / messageTransport "pfd") 而非内联 base64 JSON 送达宿主 (需宿主公布 bridgeRequestBinaryTransport=pfd, 宿主分支 node-m20-2-binder-body-pfd), 上行大小只受宿主请求策略 (64 MiB) 与 maxMessageBytes 约束而不再受 Binder 事务尺寸限制优化受控 fetch 的响应对象现经 Response.url 暴露 provider 返回的最终 URL (ResponseInit 不含 url, 此前恒为空串)优化Java 互操作改为整体转发到宿主的声明式白名单 (类 → 构造器 / 静态与实例方法 / 字段, 由宿主按表反射执行, 参数支持 JSON 原始值与对象句柄), 运行时不再自设类表而是把宿主公布的表读回为 java.policy, 新增 getStatic() / describe(), 成员自身抛出的异常以 ERR_AUTOJS6_JAVA_CALL_FAILED 报告优化运行时模块的 npm 优先规则收窄为只覆盖代替真实 npm 包的模块 (axios、colors、mime、nanoid、opencc、undici): node_modules 里的同名包不再替换 java、fetch、websocket、device 等 AutoJs6 facade, require.resolve 与 require 同规则, 全部运行时模块裸名可从 ESM 导入, autojs6:profile 以 moduleResolutionProfile 公布该规则, Rhino Packages 代理新增 getStatic() / describe()优化运行时槽进程在脚本执行中死亡 (被低内存杀手回收、原生崩溃、被直接杀死) 时, 失败结果改为回报系统记录的退出原因而不再只有 DeadObjectException: 消息形如 LOW_MEMORY (killed by the system low-memory killer; rss 2.6 GB) 或 CRASH_NATIVE (SIGABRT; see the logcat tombstone), 结果附 slotExit, getRuntimeInfo 附 lastSlotExit (Android 11+; 更低版本回报原因不可用)
修复嵌入执行不再输出 ExperimentalWarning 提示, 保留 warning 事件、普通警告、弃用警告和错误; Node 上游 API 稳定性与终端默认行为不变优化文件流、gzip/deflate/Brotli 压缩流和基础 VM 执行正式化; 显式启用的 Debug Inspector 在 localhost 范围内正式支持
.\gradlew.bat :app:assembleDebugRelease 构建:
.\gradlew.bat :app:assembleRelease构建参数来自 version.properties, 当前最低 SDK 为 24, 目标 SDK 为 36.
.readme/lang_*.json
.changelog/lang_*.json
.python/generate_markdown.py
app/src/main/res/values-*/strings.xml
app/src/main/res/raw-*/plugin_instruction.md
app/src/main/assets/doc/CHANGELOG-*.md
strings.xml 提供插件描述本地化; plugin_instruction.md 提供宿主侧展示的插件使用说明. README 与 CHANGELOG 由 .python/generate_markdown.py 根据 JSON 源文件生成.
- AutoJs6 文档: https://docs.autojs6.com
- Node.js 官方项目: https://github.com/nodejs/node
- Node.js 运行时构建计划: tools/nodejs/runtime-build/README.md
- 16 KB page alignment: master/docs/16kb.md
