# 更新记录 > 只记面向用户的变化。完整历史见 [commit log](https://github.com/qiannianhuanxiang/DSHA/commits/main)。 ### v1.2.0-rc1.2 / v1.2.0-rc1.2low - 对话页移除「返回 / DSHA 对话 / 浏览器打开」顶部栏,两种网页内核统一全屏显示;系统返回手势、键盘避让和错误重试保留。 - 插件市场新增「前往 dsha.cc 选插件」入口,在浏览器选取后可返回 App 粘贴下载链接或导入插件包。 - 版本码升至 111,沿用历史发布签名与环境版本,可覆盖安装。 ### v1.2.0-rc1.1 / v1.2.0-rc1.1low - 修复首次安装缺少 CA 根证书导致插件 HTTPS 下载失败,GitHub 归档直连官方 codeload;兼容运行时追加退出日志后的结果解析。 - 本地导入优先系统文件选择器,增加备用选择器,处理空返回、ClipData 与旧文件管理器读取授权。 - 两版终端补齐 npm/npx 入口与证书,新增 dsha-plugin install 安装并登记 npm 插件。 - 修正终端 JNI 的 RELRO 布局,解决部分 Android 13 设备加载库时错误报告 Out of memory;保持 16 KB LOAD 对齐。 - 本次修复包版本码为 110,文件名与版本名沿用 rc1.1 / rc1.1low,签名不变。 - 增加 Android 6—12 / arm64 兼容版,与标准版共用插件、安装修复、终端和对话功能;额外携带 Gecko 143,旧系统自动使用兼容内核。 - 兼容版 proot / loader 与终端 JNI 以 API 23 重编,回补 Java API、旧存储权限和低版本布局属性;无线调试配对码仍需 Android 11+。 - 插件页改为分区滚动布局:管理页隐藏链接安装区,名称、说明、开关分行,增加「更多」入口;长错误通过弹窗完整查看,避免挤压列表。 - 补齐安装模块第 2 步:修复 Python、按需联网安装 curl/git/证书,检测真实运行结果;恢复清晰的 1—6 步入口与失败报告,第 4 步使用内置 pnpm。 - 补齐 proot 硬链接模拟目录的映射,修复 apt 安装时 dpkg 报文件不存在的问题。 - 插件市场支持 GitHub 仓库、分支 / 子目录、Release 与 HTTPS 压缩包链接识别,可从分享文字提取链接。 - 本地导入支持 ZIP / TAR / TAR.GZ / TGZ 及多插件包;导出支持多选、作用域插件名与系统保存位置选择。 - 修复第三方插件重新启用、官方核心误报缺失、导入导出结果被刷新覆盖的问题;补齐搜索、筛选、排序与来源复制。 - 插件安装检查发布包入口与依赖;失败保留原插件,混合包明确报告部分成功,临时文件用完清理。 - 标准版最低 Android 11 / arm64,编译与目标 API 37;补齐 Android 17 局域网授权、前台服务类型和全面屏边距。Android 16 核心真机验收通过,Android 11/17 与 16 KB 设备待验证。 - 真机验收补齐 Python 的 SQLite/readline 动态库及离线 pnpm 10.34.5;插件依赖改用文件复制,修复 proot 下硬链接导致更新报错的问题。覆盖安装保留配置和会话。 - 保留完整离线环境,统一 Ubuntu Python,移除 npm 缓存、重复 Python 和其他平台的二进制;压缩资产避免被 aapt 提前展开,两版共用精简后的离线资产。 - 插件卡片长按支持删除第三方插件,清理登记与文件,保留会话、设置和其他插件;内置核心插件不可删除。 - WebView 等待 Cookie 写入完成后再进入对话,自定义端口保持正确,认证失效可重新进入。 - 网页加载或渲染进程失败时展示原因、系统内核版本和重试入口,可直接用系统浏览器打开。 - 对话页接入系统文件选择器,支持附件上传;补齐键盘缩放和网页返回导航。 - 电脑模式保留真实浏览器版本,避免伪装新内核造成能力判断错误。 - 显式声明网络监听 / Wi-Fi 权限;后台无法恢复 ADB 保活时给出状态,并在回到前台后重试。 - 从同版本源码重编 Termux JNI,满足 16 KB ELF 对齐;完整运行环境的 16 KB 真机验证仍待完成。 - 启动 / 停止共用队列,停止按钮不再在主线程等待;启动完成或失败后释放门控,旧进程输出不会覆盖新会话,看门狗尊重用户停止。 ### 🚀 v1.2.0-rc1:重构版(预发布) 从零重写、保留原版框架与内容的干净骨架。`dsh` 升级到上游最新 **0.1.2-rc.1**。 - dsh 0.1.2-rc.1:内置 Ubuntu 24.04 rootfs + Node 24 + pnpm,补齐 koffi-linux-arm64 等原生模块(修复 rc.1 WebUI 起不来) - 覆盖安装不再丢插件/配置:rootfs 版本比对机制,内置包变化时强制干净重解压 - 插件管理:4 个内置插件 + 2 个官方核心带开关(**插件市场暂未开发**) - 局域网访问:3081 代理自动绑定 + cookie 自动交换 + settings 持久化修复,主页直接显示完整地址 - 无障碍屏幕操作:读屏 / 点按 / 输入 / 按键 / 滑动 / 截屏(Android 11+) - ADB 无线配对、危险命令守卫、流式悬浮条、终端 PTY、备份恢复、Keystore 加密 API key - 57 条纯逻辑单元测试 - ⚠️ 预发布版:建议重新安装(先卸载旧版)而非覆盖;反馈加 QQ 群 **975836806** ### 🧩 v1.1.9:插件真的能装上了,停止真的能停下来 **插件市场几乎重做了一遍。** 索引换成 `plugins.json`(2249 条,带 npm 包名映射与中文 描述),装一个插件现在有四级降级:npm 直装 → 作者发布的 Release 预构建包 → 授权后重试 构建 → 容器内 clone + 构建。monorepo 子目录里的插件也能装了(此前会被截成仓库根, 装完插件页空无一物)。装不上的时候不再只甩一句失败:结果可滚动、可选中、可一键复制, 并且插件页会显示「已启用但没加载起来」以及**为什么**(这条状态是 dsh 进程内报回来的, 比 `package.json` 里写着「已注册」可信)。 | 插件相关的其它变化 | | |---|---| | 批量操作 | 长按进入多选,一次启用 / 禁用 / 导出 / 删除 | | 导入 | 认 gzip / zip / tar,按文件头判格式;单插件、多插件、GitHub zip 的多包一层都能识别 | | 导出 | 卡片上单个插件导出,或整批导出到 `Download/DSHA/插件/` | | 存档点 | 改插件之前自动留一份可回退的状态(按需生成,不占日常空间) | | 补丁热开关 | patch 层的开关不用重启,约 1 秒生效 | | 自愈 | 「装任何插件都失败」的一类根因是自指依赖导致 `ELOOP`,现在启动时自动修;修不了的移进隔离目录并告诉你需要重装哪个 | **备份:换设备恢复不再是空的。** 对话等热数据在手机上是指向公开目录的符号链接,而 `tar` 默认只存链接本身 —— 同机恢复看不出问题,换设备恢复就是一片空白,而这正是备份功能被宣传 的场景。现在备份会额外把这些数据解引用快照一份。同时备份可以**分范围**:全量 / 只对话 / 只插件,部分备份恢复时只覆盖对应内容(拿只含对话的包恢复,配置与插件保持现状)。 **停止按钮真的能停下来了。** 这条查出两个环境层面的硬事实:`/proc/net/tcp` 在非 root 的 Android 上读不到(所以 `ss`/`netstat`/端口反查全是空的),`/proc` 只看得到同一个 uid 的 进程。所以改成不靠猜命令行:启动时把进程号落盘,停止时按号精确停,并写一个「用户已停止」 标记 —— 看门狗和重启脚本每轮都检查它,看见就自己退出。停完 4 秒和 15 秒各回看一次, 真有东西把它拉起来就把「谁拉的」记进活动日志。另外**息屏保活**补上了:`WAKE_LOCK` 权限声明了很久,却从来没有一处真正获取过,熄屏后容器被冻住,回来什么都停了。 **快了一些。** 内置环境的离线包此前被打包工具白压了一遍(301MB 只压掉 1%),于是首次 解压要多解一层,现在少了这一层,解压缓冲也从 8KB 提到 256KB。插件市场页加了 6 小时 缓存,第二次打开不再等 800KB 下载,断网也能浏览。启动前的自愈脚本从 6 次容器会话合并 成 2 次,活动日志里会写「启动准备耗时」方便对比。 **其它**:`Download/DSHA/` 分成 `存档 / 插件 / 下载` 三个子目录(老位置照旧能读)· WebUI 里点下载终于有反应了(内嵌浏览器此前完全没接下载回调)· 设备桥到 27 个端点, 新增 `/app/help`(agent 按需查完整清单,不必每轮都背一份)与 `/app/version`(插件做特性 检测)· PTY 终端的显示与输入回显修复(社区 PR #38)· 纯逻辑断言 153 → 300 条,另加 解压往返与停止判据两套端到端测试。 完整说明见 [CHANGELOG.md](https://github.com/qiannianhuanxiang/DSHA/blob/main/CHANGELOG.md)。 > ⚠️ **1.1.9 在发布当天覆盖过一次**(tag 没变,versionCode 98 → 99)。首发那个包在 > 「v1 → v2 重解压内置环境」这条路上有三个问题:① 数据保护跟随符号链接 —— 一次升级把 > 对话复制三遍,空间不够时会在 rootfs 已经删掉之后失败;② `/root/plugin-src/` 整个目录 > 不在保护范围内 —— 用 clone 构建装的插件会静默消失;③ 解压前没有空间预检。 > 如果你在 2026-08-29 早上下过 1.1.9,请重新下载一次 —— 设置页「关于」里能看到 > versionCode,**修复版是 99**。 ### 🛠 v1.1.9.1:重解压不再丢工作区,升级中断了还能把数据找回来 **1.1.9 在「发现新版内置环境 → 重解压」这条路上丢了工作区里的东西。** 原来的数据保护 只挑三样复制:`.dsh`、`plugin-src`、各工作区的 `.env` **这一个文件** —— 工作区目录里 其它内容(你写的代码、agent 的产出、下载的文件)随 rootfs 一起被删了,而且不在备份里, **找不回来**。如果你在 1.1.9(versionCode ≤ 99)上做过重解压、发现工作区空了,不是你的 操作问题,是那一版的缺陷。 1.1.9.1 把数据保护改成**整个 `/root` 挪走**(而不是挑几样复制): - 不再有「哪些文件要保」这个判断 —— 它就是之前三次漏东西的共同根源; - 用移动而不是复制:同一文件系统里瞬间完成、不占额外空间。之前对话几个 GB 的用户 正是在复制这一步空间不够、导致升级中断(而且那时 rootfs 已经删了); - 还原时同名冲突**以你原来那份为准**,工作区、插件源码、配置都原样回去。 **升级中断后数据还在。** 如果重解压中途失败(空间不够、被系统杀、断电),现在启动时会 弹窗告诉你「上次升级没有完成,数据还在」,可以恢复回来;恢复时把现有的 `.dsh` 挪到 `.dsh.pre-recover-<时间>` 而不是覆盖 —— 两份都留着,你自己挑。 **这次没有可回滚的后悔药**:1.1.9.1 修的是「之后的重解压」,**已经丢掉的工作区文件 找不回来**(那版不备份它们)。建议装完这版之后手动做一次完整备份,作为你自己的保险。 > 另外提醒:如果你在 2026-08-29 早上下过 1.1.9(versionCode 98/99),它的 APK 已经 > 被替换成这个修复版 —— 重新下载一次即可,下载页两个版本(1.1.9 与 1.1.9.1)现在 > 是同一个包(versionCode 100)。 ### 📺 v1.1.8:AI 输出实时上屏,危险命令就地批准 屏幕顶部多了一条**流式悬浮条**:agent 正在生成的内容像歌词一样实时滚出来, 调工具时显示成「⚙ 正在执行命令: ls -la」——带命令原文,而不只是「正在执行命令」。 底色、不透明度、显示行数、停留时间都能调,带预览按钮,不用等 agent 说话就能试样式。 思考过程(reasoning)可选显示。**默认关闭**:内容会直接显示在屏幕上,旁边的人也看得见。 危险命令的确认也搬到了悬浮条上 —— 原来只有通知和前台弹窗两条渠道,可 agent 干活时 用户往往并不在 App 里。现在是**第三条渠道**而非替代:三条共用同一个 epoch,谁先点谁生效。 免 ROOT 做不到真正的「状态栏歌词」(只有 Flyme/exTHmUI 认 ticker flag,其余机型要 Xposed hook 系统界面),所以走自绘悬浮窗:一次性授权、全 ROM 通用。 **内置移动端适配换成 [dsh-web-mobile](https://github.com/mexiaosqwq/dsh-web-mobile)**(MIT): 窄屏单栏 + 目录抽屉、设置改底部 sheet、状态栏安全区、表格与气泡排版。 旧插件作者长期停更;升级时会自动把它从 profile 摘掉并删除实体(两个插件改造同一批 DOM 元素,同时激活会互相打架),此前手动禁用过的话新插件也保持禁用。 同版修掉的问题里,有几个是「一直没人发现它是坏的」那类: | 问题 | 根因 | |---|---| | 局域网访问打不开 | 剥离 token 时把请求行的 HTTP 版本一起吃掉(`GET /?token=x HTTP/1.1` → `GET /`),后端直接 400 | | 局域网页面能开但一直转圈 | token 靠浏览器自动带的 `Referer` 生效,而 WebSocket 握手不发 Referer → 必然 401;顺带 token 会随外链泄漏给第三方 | | 装过 rc 版就再也收不到更新 | 版本号解析把 `7-rc81` 拼成 `781`,比任何正式版都「新」 | | 脚本热更新永久失效 | 增量清单落后于 assets:下到新文件、校验旧哈希、整批丢弃,界面上什么都不说 | | 自检脚本一启动就崩 | 正则里 `\(` 写成 `\\(`,模块级 `re.compile` 直接抛错 | 现在这些都有守门人盯着:新增 Fast checks 流水线(清单一致性 + 离线验签 + 纯逻辑断言 + assets 脚本真编译),发布时证书指纹不匹配直接中止 —— 发一个用户装不上的包比发布失败糟。 ### 🔐 v1.1.7:对话数据不再随卸载消失 会话、设置、附件迁到 **内部存储/Documents/dshdata**,原位留私有符号链接。 文件管理器里直接可见、可自行备份,**卸载 App 或换机重装后数据仍在**。 进入 App 会自动申请「所有文件访问」权限并说明用途;授权后立刻迁移, 不必等下次启动。自检新增「对话数据存放位置」一项,明确告诉你现在到底会不会丢 —— 之前这个迁移在缺权限时会**静默跳过**,用户以为安全了其实没有。 刻意留在私有目录的东西:`DSH_HOME` 本体(dsh 维护的 `node_modules` 符号链接, 公开 FUSE 禁止软链)、`.credentials.yaml`(公开区强制 660,且密钥会暴露给其他 App)。 **API Key 改用 Android Keystore 加密**(AES/CBC,密钥不出 Keystore), 备份里的那份也加密后再写 —— 此前是明文进 `Download/DSHA` 公共目录。 同版还修了两个影响日常使用的问题: | 问题 | 根因 | |---|---| | 每条 agent 命令都弹危险确认 | 守卫把我们自己注入的 `source …dsh-guard.sh 2>/dev/null;` 前缀当成用户命令,其中的 `>` 让「覆盖关键路径」判据恒真 | | 深色模式按钮浅蓝底浅字看不清 | Material3 把 `