Repository navigation
Releases: JackLuguibin/xscript
Release list
XScript v0.2.6
新增
- 后台悬浮窗(参照 AScript 的 App 小悬浮窗):脚本运行、应用切到后台时,屏幕边上出现一个悬浮窗——绿点 + 工程名 + 已运行时间;可拖动,松手吸附到左 / 右边并记住位置(重启也在);点一下展开 运行 / 停止、日志、打开(停止是用户停止,不会触发“停止后重新运行”)。回到应用或脚本结束就收起。首页和打包 App 新增 悬浮窗显示:运行时显示(默认)/ 后台一直显示(没有脚本也显示“空闲”悬浮窗,可直接点运行)/ 已关闭;悬浮窗权限 一行显示“未授权,点此开启”,设为非关闭而没授权时弹窗引导去系统页面,没授权时静默不显示、脚本照常运行。窗口放在主进程,由已有的前台服务通知保活,不额外加通知,主进程被系统杀掉重启后自动恢复。
GET /status新增overlay(enabled / always / permitted / visible / expanded / app_foreground / side / reason和位置大小),/settings新增float_always。ui.float_show(x, y, dim)/FloatWindow.show(x, y, dim)现在按 AScript 的 x / y / dim 定位(-1 / 0 贴边、小数为屏幕比例、正数像素;始终贴边)。AScript 实际行为和我们的差异见 功能对照 末尾的“悬浮窗”一节(没有来源的细节没有照搬)。验证:JVM 单测 19 项(可见性判断、面板状态机、位置夹取 / 吸附 / 还原 / AScript 坐标)、scripts/device_float_e2e.py在 16KB(API 37)和 4KB(API 34)两台模拟器上各 50 项(授权用appops、真实按 HOME / 点击 / 拖动,用dumpsys window和 uiautomator 检查窗口类型、位置、计时、停止后脚本真的退出、前台不显示),另在 16KB 模拟器上装了新打包的 App 验证,并在 4KB 模拟器上杀掉主进程验证脚本还在时悬浮窗自动恢复。 - 悬浮窗面板按钮改成“图标在上、小字在下”:运行 / 停止、日志、打开、隐藏用手绘矢量图标(
res/drawable/ic_float_*.xml,没有新依赖)加 11sp 标签,每个 ≥ 48dp(64 × 56dp)、间距均匀、按下有水波纹;运行是播放图标,运行中变成红色停止图标;面板改成随系统深浅色:浅色模式浅底深图标、深色模式深底浅图标(带描边,不透明)。FloatWindow.add_menu的按钮同样是图标 + id 小字:给了图片就原色显示,没给或读不到图片就用通用图标,一行最多 4 个。内容描述保留,图标和标签对读屏隐藏避免重复朗读;窗口仍然自己量好大小,字体放大到 1.5 倍也不裁切。验证:device_float_e2e.py新增按钮布局 / 均匀间距 / 大字体不裁切 / 脚本图标 vs 通用图标的像素检查,16KB 和 4KB 两台模拟器全部通过。 - 悬浮窗优化:对着两台模拟器实际用了一遍(待机 / 运行 / 展开 / 拖动,深浅背景,字体 1.0 / 1.5,竖屏 / 横屏)后修了真正有问题的地方:
- 触点太小:药丸高 37dp、面板按钮约 29dp,现在药丸和每个按钮都 ≥ 48dp;新增 隐藏 按钮(隐藏到下次运行或回到 App)。
- 盖住状态栏、刘海和底部手势条(拖到顶 / 底会压在系统栏上):现在按系统栏 / 刘海 / 导航条的 insets 摆放,拖到边缘停在安全区内;横竖屏各记一个位置,旋转后重新摆放。
- 一直挡着内容、深色背景下看不清:约 5 秒没碰就缩成 48dp 半透明小球(显示时间,红
!表示出错),碰一下恢复;深色模式换底色并加描边;dim(FloatWindow.show 的透明度)真正生效,小球在其基础上再淡。吸附带缓动。 - 状态不清楚:绿 / 灰 / 红三种状态点;脚本报错或进程死亡后悬浮窗保留约 8 秒并写“出错”(正常结束、用户停止不会)。
- 字体大小或深色模式切换后悬浮窗不更新:现在自动重建;读屏有“状态 + 名称 + 已运行时间”的朗读文字,点击可被 TalkBack 触发。
- 面板里按钮被裁掉(窗口宽度没跟着变宽):窗口大小改为自己量好后精确设置。
- 每秒一次的计时器每次都查进程列表:改为最多每 4 秒一次、只在文字变化时更新、屏幕熄灭时降频,隐藏时没有轮询;20 秒内主进程 CPU 约 1%(一个核)。
FloatWindow.add_menu现在可用(ui.float_add_menu):往面板里加圆形图标按钮,点击在脚本里另开线程调回调,remove_system=True隐藏内置按钮,脚本结束清除。/status.overlay新增state / error / menus / insets / alpha / screen_width / screen_height,reason新增user_hidden。- 没做:半隐藏到屏幕边外的小球(触点会小于 48dp)、长按菜单(点一下已能展开)、避让输入法(悬浮窗不抢焦点,不受影响)、多显示器。
- 验证:JVM 单测
FloatLogicTest扩到 32 项;Python 运行时测试 5 项(add_menu);scripts/device_float_e2e.py扩到 134 项,16KB(API 37)和 4KB(API 34)两台模拟器各全部通过(含小球尺寸 / 透明度、触点尺寸、拖到状态栏 / 导航条、隐藏、出错提示、add_menu 点击回调、字体 1.5 与深色重建、横竖屏分别记位置、CPU)。
- 修复:
RunState的状态文件改为原子写入,另一个进程不会读到写了一半的空文件。
XScript v0.2.5
新增
- GitHub Actions:持续集成 + 推 tag 自动发布:
.github/workflows/ci.yml(push / PR 到 main)跑管理后台与 MCP 测试(Python 3.10 和 3.12)、设备端 Python 运行时测试、Web IDE 的 node 测试(无头 Chrome)、VS Code 扩展单元测试 + vsix 打包、Web 控制台构建、Kotlin JVM 测试 + debug APK + 16KB 检查、App 与插件版本一致检查;release.yml(tagvX.Y.Z)重新跑 CI,检查 tag / versionName / 插件版本 / CHANGELOG,用仓库 Secret 构建签名 APK,打包 vsix,生成SHA256SUMS,校验签名证书和 16KB 对齐,再创建 GitHub Release(缺 Secret 时直接失败,绝不发布未签名 APK)。scripts/release.sh新增verify-apk和notes。没有覆盖的(设备 / 模拟器端到端、真实 VS Code 宿主测试等)见docs/发布.md。 - README 里的 VS Code 插件说明和截图;发布时一起打包 vsix:根 README 新增「VS Code 插件」一节(侧边栏 + 运行日志、断点调试两张真实截图,真实 VS Code 连模拟器上的演示工程,截图由
ide/vscode-extension/scripts/vscode-screenshots.sh通过 DevTools 协议生成,不需要屏幕录制权限)。新增scripts/release.sh(check/prepare/build/publish)和 发布流程:发布时构建xscript-vscode-X.Y.Z.vsix,和签名 APK 一起放进dist/release/,SHA256SUMS同时覆盖两者,再用gh release create附到同一个 GitHub Release。插件版本号 = App 发布版本号(现为 0.2.4,原 0.2.0 未发布过),verify.sh检查两者一致;插件暂不上架应用市场。 - VS Code 扩展验证不再弹登录:查明弹出来的是 Welcome 页 + 内置 Copilot Chat 的「Sign in」、内置 GitHub Authentication 读写钥匙串(创建登录钥匙串里的「Code Safe Storage」条目)、Edit Sessions 的云端更改提示,并且会在真实
~/.vscode里写文件。vscode-host-test.sh现在用临时HOME、关掉 GitHub / Microsoft 认证和 Copilot 内置扩展、--use-mock-keychain、临时配置里关掉 AI / 欢迎页 / 云端更改 / 遥测 / 更新;新增vscode-no-prompt-check.sh读取编辑器实际显示的内容和 macOS 窗口来证明没有提示;成功运行自动删除临时目录;重新运行的检查改成轮询状态,不再偶发失败。 - VS Code 扩展对齐 AScript 官方扩展:对照应用市场里的 AScript 扩展 0.3.0(读了它的 vsix 清单和官方文档)补齐:
- 活动栏 XScript 视图:保存的设备(在线 / 离线、运行状态、行内运行 / 停止)、手机上的工程(行内运行 / 拉取)、工具入口。
- 设备管理:添加 / 编辑 / 删除、选择运行设备(编辑器右上角手机图标,记在工作区设置)、扫描设备(ADB 含自动
adb forward,加局域网 9860 端口)。 - 新建工程(空 / Hello / AScript 写法模板,生成
__init__.py+build.as+res/);build.as也被识别为工程。 - 同步:增量上传(按大小 + 内容摘要,只传新增和修改的文件)、
.vscode/.syncignore(gitignore 风格,和 AScript 同一路径)、从设备拉取工程(有差异先确认)、工程同步菜单。 - 运行:Ctrl+Shift+R(AScript 同款,F6 保留);再次运行先停止再同步再启动;运行时 ▶ 换成 ■(
xscript.running上下文)。 - 另有 ADB 终端、投屏、命令中文标题(
package.nls.zh-cn.json)、设置xscript.adbPath/xscript.scanLan。 - 不做的(AScript 自家服务或格式、或 XScript 不适用):Windows 本地运行、iOS、
.was导包与上传分发、官网 / 云控入口、自动下载 scrcpy、公网地址 + 密码设备;逐项对照见ide/vscode-extension/README.md。 - 验证:38 个单元测试;
scripts/vscode-host-test.sh(原cursor-host-test.sh,现在只用真实 VS Code 1.142,隔离配置)在 mock 和两台模拟器上各 36 项通过,含经 VS Code 调试 API 在断点处停下并求值、截图、扫描、运行 / 重新运行 / 停止 / 拉取。
- 修复:调试启动偶发超时:「等待调试器初始化」的 20 秒超时用了测试里被缩短的 sleep,机器忙时偶尔把握手判成超时(
verify.sh里见过一次);改用真实计时器。 - Python 版本统一为 3.10+:管理后台的
requires-python从 3.11 降到 3.10,和设备(3.10)、MCP 服务(3.10+)一致;3.10 通过环境标记使用websockets 16.1.1/sqlalchemy 2.0.54,3.11+ 仍用17.1/2.1.1。scripts/verify.sh新增 3.10 检查(.venv310,用 uv 自动创建,无 uv 或离线时跳过)。顺带让打包队列的asyncio.Queue在运行中的事件循环里才创建。不支持 3.9:mcp包本身要求 3.10+。文档补充了 AScript(设备 3.8,电脑 3.9–3.13)和 XScript 的 Python 版本对照。 - 支持 16KB 页面设备(numpy / OpenCV / Pillow 恢复可用):以前在 16KB 页面的设备或模拟器上,内置 numpy 导入失败(
library "libopenblas.so" not found),OpenCV、Pillow、图片字库(CvFontLib)、screen.capture_cv()、OCR 和 YOLO 跟着不可用。根因是 Chaquopy 17 提供的 numpy 1.23.3、opencv-python 4.5.1.48、Pillow 9.2.0 的原生库只按 4KB 对齐,没有可升级的对齐版本。现在清单里开启android:pageSizeCompat="enabled"(系统的 16KB 兼容模式),16KB 和 4KB 页面的模拟器上这些功能都通过(device_cvfont_e2e.py、device_ml_e2e.py、新的device_native_e2e.py、截图 / 调试 / 链接启动冒烟)。新增scripts/check_16kb.py <apk>(zipalign -c -P 16、所有.so(含 pip 轮子里的)的 ELF 对齐、清单属性;--strict要求全部 16KB 对齐)和scripts/device_native_e2e.py <设备地址>。限制:轮子里仍有 4KB 对齐的原生库,兼容模式首次加载稍慢、内存略高,只在 Android 17 模拟器验证过;彻底对齐需要自己用 NDK 重编这些轮子或等 Chaquopy 发布。 - 网页 IDE:撤销替换、正则防卡死、手机屏幕布局:
- 撤销替换:搜索面板新增「撤销替换」,一步撤销最近一次「全部替换」(含写入设备的文件;替换后又被改过的文件不动并列出)。
- 正则防卡死:正则模式下,
(a+)+、(\w*)*这类嵌套无限重复直接拒绝;其余正则在 Web Worker 里运行,单个文件超过 2.5 秒就中止并提示「正则表达式运行超时」,页面不会卡死;正则最长 1000 个字符。 - 手机屏幕(宽度 ≤ 600px):文件区改成「☰ 文件」抽屉(点文件或点编辑区自动收起),工具栏、调试区和日志区压缩,补全弹窗不再超出屏幕。已在无头 Chrome 移动模拟和两台模拟器自带的 Chrome(155 / 113,真实触摸和屏幕尺寸)实测。
- 补全弹窗:窄屏上输入长行时浏览器会自动横向滚动跟随光标,以前这会把补全弹窗关掉(手机上长行几乎没法补全);现在滚动时弹窗跟着光标重新定位,光标滚出视野才关闭。
- 网页 IDE:重命名 / 移动文件和文件夹:目录树里选中后按 F2、点「重命名」、右键菜单,或直接拖到目标文件夹。已打开的标签页、未保存的修改、断点和展开状态跟着走;目标已存在返回冲突,不会覆盖;入口
__init__.py受保护。设备接口新增POST /projects/{name}/move({"from","to"},400/404/409,单次原子重命名)。 - 链接启动:浏览器真实页面验证:新增
scripts/device_scheme_e2e.py和scripts/device_packed_scheme_e2e.py,在两台模拟器的 Chrome(113 / 155)里点真实网页上的链接,覆盖确认框(显示工程名和来源、取消不运行、运行才启动)、stop不弹窗、params传入脚本、非法名 / 工程不存在 / 已有脚本在运行的提示、JS 按钮和无点击跳转(都只到确认框)、三种模式,以及打包 App 自己的协议(只运行打包的小程序,name=其他工程被拒绝,xscript://只有主 App 响应)。 - VS Code / Cursor 扩展:打包 vsix、真实编辑器加载验证、调试日志点修复:
npm run package生成xscript-vscode-0.1.0.vsix;scripts/cursor-host-test.sh把它装进 Cursor(隔离配置)并在扩展宿主里检查激活、11 条命令、调试类型和快捷键;scripts/debug-smoke-advanced.js在模拟器上实测条件断点、命中次数、日志点和修改变量。修复:调试控制台里看不到日志点的输出(适配器把 debugpy 带 source / line 的 stdout 当重复丢掉了)。 - VS Code / Cursor 扩展:一键调试:在 Python 文件里按 Alt+F6(或编辑器右上角的调试按钮、资源管理器里右键工程文件夹 Debug Project on Device):自动保存并上传工程、在手机上启动调试器、连接并进入 VS Code 自带的调试界面;行断点、条件 / 命中次数断点、日志点、单步、调用栈、变量、监视 / 调试控制台求值都走标准调试协议,经设备已有的
/debug/*接口转发,不用改手机端。也可以在launch.json里写{"type":"xscript","request":"launch","projectRoot":"${workspaceFolder}"}。电脑上的文件路径和手机上的路径自动互相转换;停止调试会终止手机上的脚本,「断开但不终止」则让它继续跑完。 - 卡密:续期叠加、体验卡、多设备卡、滥用告警(管理后台):
- 续期叠加:设备在同一应用上还有未到期的卡时,新激活的卡从旧卡到期时刻起算(旧卡已过期或没有则从现在起算;永久卡不叠加;解绑后换回不重复叠加)。生成批次时可关闭「续期叠加」。
- 体验卡:有效期按小时(最长 30 天),只绑定一台设备,不参与叠加;每台设备在每个应用上只能用一张,解绑或删除体验卡都不会重置(
trial_uses表)。 - 多设备卡:一张卡可绑定 1–100 台设备,共用同一个到期时间;超出上限返回「卡密绑定的设备数已达上限」。可以只解绑其中一台(
POST /api/cards/actions的device参数),被解绑设备的授权在联网复核时失效。 - 滥用告警:24 小时窗口内检测四种情况——同一张卡被多台设备尝试、单设备激活大量卡密、单 IP 为大量设备激活、单 IP 反复猜不存在的卡密;命中后写入审计日志(
card.abuse)、列在「卡密 → 滥用告警」,并通过订阅了「卡密滥用告警」的机器人 / Webhook 发出(同一对象每小时一次)。阈值在「系统设置 → 安全」里配置,0 为关闭。 - 数据库自动升级(schema v4);旧卡密按普通单设备卡处理。体验卡、多设备卡和叠加开关在生成卡密时设置,都需要操作员以上权限;阈值只有管理员能改。
- 后台:登录 IP 白名单(系统设置 → 安全):每行一个 IP 或网段(IPv4 / IPv6、CIDR),设置后只有名单内的 IP 能登录后台、使用已登录的会话和 API 令牌;留空 = 不限制。保存时名单不包含你当前的 IP 会被拒绝,避免把自己锁在外面;被拦截的登录写入审计日志(
auth.ip_denied,限频)。设备云控/ws、/license/*和/pub/*不受影响。万一仍被锁在外面,在服务器上运行xscript-server reset-allowlist。 - 后台:App 公告和 APK 强制更新(新页面「应用运营」;打包的 App 端见下一条):
- 公告:按应用包名(
*= 所有应用)、级别(通知 / 提醒 / 紧急)、起止时间、启停管理,操作员以上可编辑;公开接口GET /pub/app-notices?app=&version_code=(最多 5 条,纯文本)。 - 版本更新:管理员为每个应用设置最新版本(选一个打包成功的任务,或填外部下载链接)和「最低版本号」;公开接口
GET /pub/app-update?app=&version_code=返回是否有更新、是否必须更新、下载地址、sha256 和说明;/pub/app-update/apk下载本站打包的 APK。被引用的打包任务不能删除,也不会被存储清理删除;APK 被清掉时不会把用户锁在 App 外。
- 公告:按应用包名(
- 打包的 App 接入公告和强制更新:打包出来的 App(后台打包会自动填入服务器公网地址,命令行用
--ops-server,缺省回退到--update-server/--license-server)打开首页时向后台取公告和更新信息,最多每分钟一次,冷启动一定检查:- 新公告弹窗显示一次(紧急 / 提醒有标记),首页新增「公告」行可随时重看。
- 有新版本时提示(可「稍后」),首页「应用更新」行显示状态。
- 版本号低于后台设置的最低版本时必须更新:首页弹出无法关闭的对话框,脚本不能启动(界面、链接启动、定时任务、云控都被拦住);点「下载并安装」下载 APK、校验大小和 SHA-256,再交给系统安装程序(需要允许安装未知应用)。
- 不会把用户锁死:后台没有可用的 APK(被清理)时返回「无更新」,限制自动解除;版本号达到最低版本后不再拦截;下载或校验失败可以重试,不会安装。
- 新增权限
REQUEST_INSTALL_PACKAGES和 FileProvider(只暴露缓存里的updates/目录)。
- 模拟器截图权限和
/screen缩放的真机验证:新增scripts/emulator_grant_capture.sh [序列号](用 uiautomator 点掉系统的录屏授权对话框,API 34 的「Start now」和 API 37 的「Share entire screen」两种对话框都认)和scripts/device_screen_smoke.py <设备地址>(检查/screen以及?max=、?format=jpg&quality=的尺寸、格式、不放大、非法值忽略)。两个模拟器(16KB / 4KB 页)都通过。 - 卡密:App 内续期、设备黑名单、告警重启不丢:
- 打包的 App 已激活后,点首页「卡密授权」行变成「续期」对话框:显示当前到期时间,输入新卡密后从当前到期时间起叠加;成功提示「续期成功,有效至 …(延长 N 天)」。在模拟器上用真实打包的授权 App 验证了 30 + 30 + 15 + 7 天的连续叠加,以及服务端各张卡的到期时间。
- 设备黑名单(卡密 → 设备黑名单,操作员以上可改):黑名单里的设备不能再激活卡密,已激活的授权在 App 下次联网复核时失效(离线授权码不受影响);滥用告警里「单设备激活大量卡密」一行有「加入黑名单」按钮;加入 / 移除都进审计日志。接口
GET/POST /api/cards/bans、DELETE /api/cards/bans/<设备>。 - 滥用告警窗口持久化:24 小时的统计窗口和「同一对象每小时最多一次」的冷却写入数据库(
abuse_events、abuse_reports),重启后继续计数、不会重复告警。
- 链接启动:
xscript://run?name=<工程>[¶ms=<JSON>]运行脚本,xscript://stop停止;打包出来的 App 用包名作协议,只能运行自己的小程序。首页新增「链接启动」开关:每次确认(默认)/ 直接运行 / 已关闭。 - 图片字库(CvFontLib):
ascript.android.screen.gp_tasks.CvFontLib(part_img, font_lib, confidence, rect, spacing, rgb),用一组字符小图做模板匹配,按行、按左右顺序拼出文字;也可放进 GP 管线,或用CvFontLib.recognize(...)直接得到文字。已用真实 OpenCV 在主机上测试,并在 4KB 页面的 Android 14 模拟器上用设备内置的 numpy 1.23.3 / OpenCV 4.5.1 跑通同一组 13 个测试。 - 网页 IDE:多标签页关闭:标签页右侧有 × 按钮,也支持鼠标中键、Alt+W 和右键菜单(关闭 / 关闭其他 / 关闭右侧 / 关闭已保存 / 全部关闭);有未保存修改的文件先确认再关闭。
- 网页 IDE:工程内搜索 / 替换:Ctrl/Cmd+Shift+F 或「搜索」按钮;区分大小写、全字、正则、文件过滤(
*.py, lib/**, !tests/**),结果按文件分组、点击跳转;全部替换或按文件替换,替换前确认,没有未保存修改的文件直接写入,有未保存修改的只改编辑器内容。 - 网页 IDE:手机截图面板:截取一帧,点击取坐标和颜色,插入坐标到编辑器,保存到工程
res/img/或下载。 - 网页 IDE:API 补全:输入时弹出(或 Ctrl/Cmd+空格)
xscript.*/ascript.*的模块路径、函数、类和成员,带签名和说明;认识import、from ... import、别名和x = Class()实例,也补全文件内的名字、内置函数和关键字;字符串和注释里不弹出。索引由scripts/gen_completions.py从运行时源码生成,verify.sh检查是否过期,离线可用。 - 网页 IDE:语法检查:本地检查括号、字符串、冒号、缩进和 Python 2
print,红色波浪线、行号标记和状态栏问题数(点击跳转);保守设计,用 Python 标准库 1373 个文件和 3000 个随机破坏的样本对照 CPython 验证过零误报。
修复
-
模板匹配漏掉细线小图(图片字库读不全):搜索多个目标时的「半分辨率预筛」对小模板(不到 48 像素)把 1 像素的细笔画抹掉,导致完全相同的小图(置信度 1.0)被判为不匹配;用真实字体渲染的
0、6、8等数字因此整个丢失(2026-10:15读成22-1:15)。现在只对 48 像素以上的模板做预筛;影响所有find_images/ 图片字库调用,只会多找到、不会少找到。用 Pillow 渲染的真实字体字形在 4KB 页面模拟器上端到端验证(scripts/device_cvfont_e2e.py,9 个用例);在 4KB 页面模拟器上同时验证了运行时 pip(PyPI 纯 Python 包 + Chaquopy 源的原生包 MarkupSafe + requirements.txt 自动安装)、PaddleOCR v5 模型下载与识别、YOLO11n 经 ONNX Runtime 检测(scripts/device_ml_e2e.py)。 -
中 · 透明模板找图(设备):带透明通道的模板在 Android 内置的 OpenCV 4.5.1 上永远找不到。原因是该版本的
matchTemplate会把 uint8 掩码原地改成 0/1,随后「掩码 > 128」得到 0 个有效像素,得分全为 0;主机上的 OpenCV 4.10 不会这样,所以主机测试一直是绿的。现在先计算有效像素再传入掩码副本,并补了回归测试。这是在 4KB 页面模拟器上首次运行 numpy/cv2 相关测试时发现的。
XScript v0.2.4
XScript v0.2.4 正式版,使用与 v0.2.3 相同的 Release 密钥签名,可直接覆盖升级 v0.2.1–v0.2.3。主应用版本号 0.2.4,versionCode 6。
下载与安装
xscript-v0.2.4-release.apk:Android 8.0(API 26)及以上,包含 ARM64 和 x86_64。SHA256SUMS:安装包 SHA-256 校验文件。- 从 v0.2.1–v0.2.3 正式版可直接覆盖安装;从 Debug 版切换需先导出项目再卸载(卸载会清除应用数据)。
- 全新安装后需先授予通知权限,HTTP 服务才会启动。
- 「管理后台」修复需要同时更新服务端(backend)。
修复
- 高 · 管理后台权限:操作员可以手动运行、启停或删除管理员创建的「定时下发小程序」任务,相当于绕过管理员权限向设备下发代码;现在这四种操作都需要管理员。
- 中 · 设备接口转发白名单:操作员可转发的
/projects/…/run只校验前后缀,POST /projects/run也能通过(在设备上会新建名为 run 的工程);现在必须是/projects/<工程名>/run|stop|files|config。 - 中 · 脚本退出码:
raise SystemExit("错误信息")被当作正常退出(0);现在与 CPython 一致,打印信息并以 1 退出。 - 低 · 设备地址解析(MCP / VS Code 插件):带路径的地址(如
http://ip:9860/tools/)和 IPv6 地址解析错误;现在都支持。 - 低 · 错误提示(MCP / VS Code 插件):设备返回的错误原因(如「工程已存在」)丢失,现在会显示在错误信息里。
- 低 · mock 设备:读取
../路径返回 404,与真实设备(400)不一致,已对齐。
测试
- 新增:后台账号安全(会话、改密、API 令牌、两步验证滥用、设备密钥吊销、任务权限、转发白名单)、MCP 工具层与端到端、运行时 runner(退出码、日志、启动参数、线程)和 action / AScript 兼容层、VS Code 插件地址解析与日志跟随、Kotlin
ScreenOptionsTest/DapTransportTest。 - 用例数:后台 32 → 40,MCP 15 → 24,运行时 170 → 189,插件 3 → 10,Kotlin 71 → 77。覆盖率:后台 85% → 87%,MCP 66% → 86%,运行时 65% → 67%(runner 18% → 93%)。
coverage加入后台和 MCP 的 test 依赖。
内部
/screen参数解析拆为ScreenOptions;DapTransport端口可在测试中替换;VS Code 插件的日志跟随逻辑移到client.ts。接口行为不变。
验证范围
- Release 构建、签名证书(与 v0.2.3 一致)及 APK 元数据(0.2.4 / 6)校验通过。
scripts/verify.sh(运行时、后台、MCP、网页 IDE 浏览器测试、Kotlin 单元测试、VS Code 插件)全部通过。- 本 Release APK 已在 ARM64 Android 17 模拟器(emulator-5554)上
adb install -r覆盖安装并回归:工程/文件接口冒烟测试、8 路并发新建(1 个 200,其余 409)、XS_DEVICE_URL浏览器测试 12/12 通过。SystemExit退出码修复只有单元测试覆盖,未在设备上单独验证。 /screen?max=缩放只有单元测试覆盖(模拟器重装后未授予截屏权限)。未做真机验证。
XScript v0.2.3
XScript v0.2.3 正式版,使用与 v0.2.2 相同的 Release 密钥签名,可直接覆盖升级 v0.2.1 / v0.2.2。主应用版本号 0.2.3,versionCode 5。
下载与安装
xscript-v0.2.3-release.apk:Android 8.0(API 26)及以上,包含 ARM64 和 x86_64。SHA256SUMS:安装包 SHA-256 校验文件。- 从 v0.2.1 / v0.2.2 正式版可直接覆盖安装;从 Debug 版切换需先导出项目再卸载(卸载会清除应用数据)。
- 全新安装后需先授予通知权限,HTTP 服务才会启动。
修复
- 删除工程可能误删工程外的数据:工程内有符号链接时,删除工程或以替换方式导入 ZIP 会跟随链接删除目标内容;现在只删除链接本身,链接目标保持不变。
- 符号链接越界:读取文件现在与写入一样做工程目录边界校验,文件/文件夹列表不再进入符号链接目录,无法通过链接读取工程外的文件。
- 并发新建:同时新建同名工程或同名文件时,只有一个请求成功(200),其余返回 409,不会互相覆盖。
- 网页 IDE 删除:「删除文件」作用于目录树中选中的文件(用方向键选中但未打开的文件也一样),选中
__init__.py时按钮禁用。
测试
- 新增网页 IDE 浏览器测试(
scripts/tests/editor-dom.test.cjs):用本机 headless Chrome 驱动真实页面,覆盖目录树点击、箭头与行点击、键盘导航、新建/删除流程、标签页与断点清理、语法高亮叠层同步;默认连 mock 设备,设置XS_DEVICE_URL=http://127.0.0.1:19860可直接在真实设备上运行。找不到 Chrome 时自动跳过。 - 新增 Kotlin 单元测试:
ProjectRoutesTest(工程/文件接口的状态码与返回内容)、ProjectStoreEdgeTest(符号链接、非法路径、中文名、深层目录、base64、并发新建)。 scripts/verify.sh现在也运行 Kotlin 单元测试(需要 JDK;XS_SKIP_GRADLE=1可跳过)。
内部
- 工程/文件接口从
ApiRouter拆到ProjectRoutes,错误码映射统一为ApiRouter.errorReply;接口行为不变。
验证范围
- Release 构建、签名证书(与 v0.2.2 一致)及 APK 元数据(0.2.3 / 5)校验通过。
scripts/verify.sh(含 Kotlin 单元测试和网页 IDE 浏览器测试)通过。- 本 Release APK 已在 ARM64 Android 17 模拟器(emulator-5554)上
adb install -r覆盖安装 v0.2.2 并回归:工程/文件接口冒烟测试、8 路并发新建(1 个 200,其余 409)、XS_DEVICE_URL浏览器测试 12/12 通过。 - 符号链接修复只在 JVM 单元测试中验证:设备上工程位于共享存储,系统不允许创建符号链接。未做真机验证。
XScript v0.2.2
XScript v0.2.2 正式版,使用与 v0.2.1 相同的 Release 密钥签名,可直接覆盖升级 v0.2.1。主应用版本号 0.2.2,versionCode 4。
下载与安装
xscript-v0.2.2-release.apk:Android 8.0(API 26)及以上,包含 ARM64 和 x86_64。SHA256SUMS:安装包 SHA-256 校验文件。- 从 v0.2.1 正式版可直接覆盖安装;从 Debug 版切换需先导出项目再卸载(卸载会清除应用数据)。
- 全新安装后需先授予通知权限,HTTP 服务才会启动。
网页 IDE
- 新建工程、新建文件(可含子目录)、新建文件夹、删除文件/空文件夹已完成,带确认、重名提示和路径越界校验;删除正在编辑的文件时会关闭标签页并清除其断点。
- 文件列表改为目录树:箭头只负责折叠/展开,SVG 图标,文件夹在前,空文件夹也显示,展开状态在刷新和新建/删除后保留,支持方向键、Enter、Home/End。
- Python 语法高亮:本地内置、离线可用;不支持补全和语法检查,超过 300 KB 的文件不着色。
设备接口
- 新增
POST /projects/{name}/dir;GET /projects/{name}/files增加dirs;PUT /projects/{name}/files支持"create": true(只新建,已存在返回 409)。 - 行为变化:重复新建工程返回 409;删除不存在的文件返回 404;删除不再递归,非空文件夹返回 409;不能删除
__init__.py(400)。详见 docs/API.md。
安装注意
- 设备上已有不同签名的 XScript 时,
adb install -r会报INSTALL_FAILED_UPDATE_INCOMPATIBLE,只能卸载重装,卸载会清除应用数据。 - 全新安装后要先授予通知权限,HTTP 服务才会启动。
验证范围
- Release 构建、签名证书(与 v0.2.1 一致)及 APK 元数据(0.2.2 / 4)校验通过。
scripts/verify.sh与 Web IDE Node 测试通过。- Web IDE 工程/文件管理、目录树、Python 高亮已在 ARM64 Android 17 模拟器(Debug 构建)验证;本 Release APK 未在设备上安装回归,未做真机验证。
XScript v0.2.1
XScript v0.2.1 正式版使用专用 Release 密钥签名,关闭 APK 的 Android 调试标志。主应用版本号 0.2.1,versionCode 3。
下载与安装
xscript-v0.2.1-release.apk:Android 8.0(API 26)及以上,包含 ARM64 和 x86_64。SHA256SUMS:安装包 SHA-256 校验文件。- 与 v0.2.0 Debug 版签名不同,无法直接覆盖安装。请先导出项目并备份数据,再卸载 Debug 版、安装正式版;卸载会清除应用数据。
- 后续正式版将沿用同一 Release 签名。密钥和密码仅保存在维护者本机,不包含在源码或发布附件中。
本次变化
- 增加主应用正式签名配置和构建说明。
- 延续 v0.2.0 的 Web IDE、DAP 调试、图像处理兼容和 Android 设备接口功能。
验证范围
- Release 构建、签名及 APK 元数据校验通过。
- 52 项 Android JVM 单元测试通过。
- 上一版本核心功能已在 ARM64 Android 模拟器验证;本次正式签名 APK 未进行完整真机回归。
XScript v0.2.0 开发预览版
XScript 0.2.0 开发预览版,基于提交 87f4fe286a1029281e3030bb095a14acc6d2edc8 构建。
本版功能
- 网页脚本 IDE:多文件编辑、保存运行、日志、工程导入导出。
- Python DAP 调试:断点、单步、调用栈、变量查看与断开恢复。
- 短信只读查询兼容修正,定位、传感器与系统权限接口。
- GP 图色流水线与可配置视觉 AI 客户端。
- 修复新版 Android 后台启动问题。
安装与验证
- 安装包:
xscript-v0.2.0-debug.apk,Debug 签名的开发版本。 - Android 8.0 / API 26+;包含 arm64-v8a、x86_64。
- 52 项 Android JVM 测试通过;断点、短信与加速度回调已在 ARM64 Android 17 / API 37 模拟器验证。x86_64 和其他真机尚未完成同等验证。
- 将 APK 安装到设备后打开 XScript,按所需功能授予系统权限。
- 文件校验:
shasum -a 256 -c SHA256SUMS。