Skip to content

v1.2.1

Latest

Choose a tag to compare

@github-actions github-actions released this 16 Oct 06:27

dsh-android 1.2.1

这一版是应用版本升级,主题是恢复模式 —— harness 起不来的时候,应用不再只能给你一个空白页。

1.2.0 的设备需要安装新的 APK。 恢复模式有一半在应用侧(面板、桥接口、自动进入),
热更新包送不过去;热包也不跨应用版本线,所以这一版的内容只随 APK 下发。

Added

  • 恢复模式:harness 起不来时也能进沙箱。连续几次启动失败后应用会自己切换过去 ——
    不加载 harness,直接起来一个 SSH 服务和一个 shell。同一 Wi-Fi 用 ssh -p 8022 root@<手机 IP>,
    插着数据线用 adb forward tcp:8022 tcp:8022,只有手机时就点面板里的「手机内控制台」
    (一个不依赖 harness 的行模式终端)。密码是每次进入时新生成、退出即失效的令牌
  • 恢复模式支持端口转发:在沙箱里把 harness 重新拉起来之后,
    用 ssh -p 8022 -L 3080:127.0.0.1:3080 就能从电脑的浏览器打开它 —— 手机自己渲染不出来时这条最省事
  • 面板里可以直接复制连接命令、换一个新令牌、退出恢复模式;SSH 主机密钥由每台设备自己生成
    (存在 /root/.dsh-recovery/),不再用载荷里那份所有安装都一样的

Changed

  • 沙箱终端服务的会话现在会回收:关掉的标签页、重载的页面以前会在沙箱里各留一个 shell,
    攒够 8 个之后新终端就再也开不出来
  • 桥接口新增 /recovery/*,/snapshot 带上恢复模式状态(给以后在设置页里做一张卡片留的)

Fixed

  • 退出恢复模式后 root 密码一定回到锁定:原来只靠脚本的信号处理和「进程退出后补一次」,
    而应用停沙箱是直接杀进程、紧接着 800 毫秒就启动下一个 guest,两处都可能被跳过;
    现在正常启动时也会锁一次,不依赖信号也不依赖时序
  • 一行畸形请求不再能让终端服务整个退出(恢复模式下它是唯一的入口)
  • 更新不会因为版本号倒退而卡住:versionCode 以前只靠公式(1.2.1 → 10201)或环境变量,
    而这条线已经原地重发到 10212 —— 现在它记在仓库的 VERSION_CODE 里,重建也还是 10213

运行时(t3)

  • 载荷里的 harness 升到 0.2.0-rc.2(npm 上的 latest;上游没有不带后缀的 0.2.0)。
    这是 t 的变化,所以必须装新 APK,热包送不过去。1.2.1 的 APK 同时是"恢复模式"和"t3 运行时"。
  • 升之前在这台设备上逐项验证过:硬链接补丁的四个发布点(三处 import 行、四个调用点、注入锚点)
    在 0.2.0-rc.2 里原样还在,所以补丁不会触发"上游改了"的拒绝;装完在 Node 22.23.2 上跑
    市场冒烟,对照组(不加载市场)与实验组(加载市场)各一次真实调用都正常;
    用真实 profile 分别起 0.1.7-rc.2 与 0.2.0-rc.2,两边页面都是 200 且 35334 字节逐字节相同
  • 补上了 prepare_rootfs.sh 缺的一步:guest 工具(git/curl/python3/tmux/openssh-server 等)
    以前是手工装进 rootfs 的,仓库脚本里没有 —— 也就是说照仓库脚本从头构建出来的载荷没有 sshd,
    而恢复模式正需要它。现在这一步在脚本里,并且装完硬校验(缺任何一个就构建失败,
    不会让一个"起不来恢复模式"的载荷发出去)

注意

  • 恢复模式期间 harness 不在运行:手机上看不到会话列表、也不能对话,它是在「修」而不是「用」
  • 修好之后记得点「退出恢复模式」,否则下次启动还是恢复模式
  • 不想装 APK 的话,已装的设备也可以在恢复模式里用 scripts/upgrade-dsh.sh 把 harness 单独升到
    0.2.0-rc.2(见 docs/UPGRADE-DSH.md);但换 t 之后载荷与设备不再一致,
    下次装全量包会把它覆盖回去

安装:下载本页的 dsh-android.apk,覆盖安装即可;会话、API Key、挂载与设置都会保留。
首次启动需要解包内置运行时(约 2 分钟),之后冷启动约 5 秒。完整说明见 README。