Skip to content

feat(ui): 建立可校验的模块化 ShortX 启动架构 - #2

Draft
7015725 wants to merge 31 commits into
mainfrom
agent/modular-ui-bootstrap-20260801
Draft

feat(ui): 建立可校验的模块化 ShortX 启动架构#2
7015725 wants to merge 31 commits into
mainfrom
agent/modular-ui-bootstrap-20260801

Conversation

@7015725

@7015725 7015725 commented Aug 1, 2026

Copy link
Copy Markdown
Owner

目的

该 PR 取代 PR #1 中“单文件 UI + 远程完整源码执行”的临时运行方式,建立可用于后续真机迭代的模块化基线。

已实现

  • 固定轻量 ShortX 入口 entry/SingBoxHub.js
  • 独立窗口开关入口 entry/SingBoxHubToggle.js
  • 15 个 Rhino ES5 本地模块
  • module-manifest.json 模块顺序与 SHA-256 清单
  • 候选目录下载和 Rhino 编译检查
  • 完整模块版本集切换
  • active.json / last_good.json / update_state.json
  • 远程失败时离线使用本地已验证模块
  • 候选启动失败时回退 last-good
  • SQLite 设置持久化
  • 动态控制 Action + Token
  • show / hide / toggle / status / stop_ui
  • 首页返回仅隐藏 UI,二级页面返回首页
  • WindowInsets 与 SOFT_INPUT_ADJUST_RESIZE
  • 莫奈极简四页面 UI
  • 明确的 Runtime Client 占位层

安全边界

当前 Runtime Client 只返回 RUNTIME_NOT_ATTACHED。本 PR 不执行 Shell,不启动或停止 sing-box,不创建 TUN,不修改路由、规则、防火墙、DNS 或代理配置。

测试入口

entry/SingBoxHub.js
entry/SingBoxHubToggle.js

详细测试顺序:

docs/ui/modular-ui-bootstrap.md

仓库侧校验:

bash scripts/verify-ui-module-set.sh

真机门禁

  1. 首次联网下载 15 个模块并显示 UI
  2. 二次启动复用本地模块集
  3. 断网后离线启动
  4. 模块损坏拒绝加载或回退 last-good
  5. 输入框光标与 IME 可逆避让
  6. 系统返回链和独立 Toggle 正常
  7. 所有 Runtime 操作保持不可执行

该 PR 暂不合并 main,等待 ShortX 真机验证。

7015725 commented Aug 1, 2026

Copy link
Copy Markdown
Owner Author

真机修复:UI 客户端目录与生产 Runtime 目录冲突

首次运行返回:

Cannot create directory: /data/system/shortx_*/SingBoxHub/bootstrap

根因是模块化入口尝试在生产 Runtime 根目录 SingBoxHub/ 内创建 UI 启动状态目录;该目录可能由 Root 安装流程创建并由 Runtime 管理,ShortX Rhino 进程不能保证具有写权限。

已统一修复:

  • 入口升级到 ENTRY_VERSION = 4
  • UI 客户端不再写入生产 SingBoxHub/ 目录
  • 首选独立目录 SingBoxHubClient/
  • 备用目录 SingBoxHub-UI/
  • 最终回退到应用私有 filesDir/SingBoxHubClient/
  • 每个候选目录先执行真实创建、写入、同步和删除探针
  • 返回结果新增 storageModerootDirpathDiagnostics
  • Toggle 入口同步支持三个客户端目录
  • Manifest 最低入口版本提升到 4

该修复不修改生产 Runtime 目录,不执行 chmod/chown,不使用 Shell,也不扩大文件权限。

7015725 commented Aug 1, 2026

Copy link
Copy Markdown
Owner Author

安全热修复:禁用自动 WindowManager 启动

真机执行模块集 20260801.02 后出现卡死并触发设备重启。当前将其按高风险 WindowManager/system_server 异常处理。

已发布模块集 20260801.03

  • sbh_15_app.js 升级到版本 2
  • 不创建 Coordinator
  • 不注册控制广播
  • 不调用 controller.open()
  • 不创建、显示或移除任何 WindowManager View
  • 删除可能残留的旧控制端点文件
  • 仅完成模块同步、完整性校验、本地加载和安全状态写入
  • 返回 safe_bootstrap_ready

当前阶段禁止运行 SingBoxHubToggle.js。待安全启动确认不会重启后,再用独立、最小化、分阶段 WindowManager 探测脚本定位触发点。

7015725 commented Aug 1, 2026

Copy link
Copy Markdown
Owner Author

进一步收紧安全边界:entry/SingBoxHub.js 已替换为 entryVersion 5 的恢复专用入口。

该入口只做:

  • 清除/隔离 20260801.0120260801.02 的 active、last-good 与本地模块集
  • 删除可能残留的控制端点文件
  • 联网读取并验证远端 Manifest 基本结构
  • 写入 recovery_state.json

明确不做:模块下载、模块 eval、Receiver 注册、Coordinator 创建、View 构建、WindowManager 调用、Shell 或 Runtime 操作。

预期返回 safe_recovery_ready,用于确认“纯恢复入口”不会触发设备重启。

7015725 commented Aug 1, 2026

Copy link
Copy Markdown
Owner Author

已根据真机探测结果直接切换为完整 UI 基线:

  • entryVersion=12
  • moduleSetVersion=20260801.04
  • 保留四页面首页/节点/日志/设置
  • 移除大面积 Canvas 绘制,改为原生 TextView/GradientDrawable
  • WindowManager 仅保留 FLAG_NOT_TOUCH_MODAL
  • 无 Insets Listener、无系统栏绘制标志、无启动动画
  • addView 轻量窗口壳,再延迟 80ms 构建首页
  • 关闭统一在主线程使用 removeView(),不再使用 removeViewImmediate()
  • 页面按需构建,切换前主动收起 IME
  • 恢复动态控制端点和独立 Toggle 任务
  • Runtime 仍保持 RUNTIME_NOT_ATTACHED,不执行 Shell/TUN/路由/DNS 操作

真机检查点:SingBoxHubClient/bootstrap/full_ui_window_state.json。PR 继续保持 Draft,不合并 main,等待完整 UI 真机结果。

7015725 commented Aug 1, 2026

Copy link
Copy Markdown
Owner Author

真机 UI 基线继续收口

用户确认完整 UI 基本测试正常。本轮保持 Runtime 安全占位,仅修复滚动页面底部安全间距:

  • sbh_06_widgets.js 升级到版本 3
  • 所有 W.scrollPage() 页面底部统一预留 48dp
  • 避免最后一排卡片/统计卡贴近底部导航区域
  • 不修改 WindowManager 参数、返回链、Receiver 或 Runtime Client
  • 发布模块集 20260802.01
  • GitHub Actions Manifest/实际文件 SHA-256 校验通过

当前入口仍为 entryVersion=12,PR 继续保持 Draft,不合并 main。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant