# 更新记录 > 只记面向用户的变化。完整历史见 [commit log](https://github.com/qiannianhuanxiang/DSHA/commits/main)。 ### v0.1.5-rc2 / v0.1.5-rc2low(正式版) 由贡献者 [@ym2025szz](https://github.com/ym2025szz) 发布,版本码 **129**,dsh **0.1.5-rc.2**,Ubuntu 基础环境 **10**,沿用原发布签名。完整内容见[正式版说明与历史对比](docs/releases/v0.1.5-rc2-notes.md)。 - 统一日夜主题、卡片、权限、弹窗与切换动画,完善短屏/大字体;检查日志和诊断报告独立滚动,重排关于弹窗。 - PTY 与简易终端支持独立标签,切换语言及页面保留进程;关闭后复用最小空缺编号,全部关闭后从 1 开始。 - 中英文原生/网页状态同步,修复缓存状态混用语言;用户输入、命令和第三方原始内容保持原文。 - 插件排序与操作框、dsh-web-mobile 2.4.1-dsha.2、真实 Agent 预设切换和宽屏文件入口。 - 修复 #64 多文件选择、旧 WebView/PDF Worker、#63 DNS 兼容;补齐 Shizuku 改包名识别和主动连接恢复。 - 完善端口冲突、慢鉴权、原生恢复与固定配置快照,修复旧平板环境迁移路径;保留数据与进程核验。 - 两版各 383 项单测(382 通过、1 跳过)、Lint 无错误。详见[最终验证范围](docs/releases/v0.1.5-rc2-build129.md)。 ### v0.1.5-rc1 / v0.1.5-rc1low(正式版) - 由贡献者 [@ym2025szz](https://github.com/ym2025szz) 发布为 GitHub 正式 Release / Latest;主线汇总此前重构预览改进,历史 Release 与 1.1.10 及更早说明保留。完整对比见[正式版更新介绍](docs/releases/v0.1.5-rc1-notes.md)。 - 修复文件和预览标签的关闭“×”被按钮最小高度撑到右下方的问题,恢复在标签右侧垂直居中;两种浏览内核实际关闭操作通过。同名 APK 已更新。 - dsh 更新至 `0.1.5-rc.1`,提供新版默认模型 DeepSeek-V41-Flash,保留 V4 Flash、Pro 与 Vision 实验模型的选择。 - 保留新版右栏引导页、文件预览、长内容滚动和代码复制,重新适配前端提示组件;输入框回车换行、旧内核 PDF 兼容和移动侧栏继续可用。 - 版本码 116,Ubuntu 基础环境版本 10 不变。alpha.2 自动覆盖升级实测约 7.45 秒,个人数据保持原位;连续启动鉴权约 3.43~3.66 秒。 - 沿用历史发布签名,两个 APK 和校验文件放在 `release`,不覆盖历史版本。详见[版本说明与真机验收](docs/releases/v0.1.5-rc1.md)。 ### v1.5-alpha.2 / v1.5-alpha.2low(本地候选版) - 修复空闲终端及其后台命令未回收,导致「重新解压环境」在维护门禁报错;确认终端退出后再开始备份或更新。 - 修复冷环境中原生扩展缓存被转换为悬空链接,导致首次启动找不到内置插件;统一直接加载随包扩展,并新增首次初始化校验。 - 覆盖升级直接解压独立 dsh 包,跳过 Ubuntu 大归档;冷安装仍完整安装并验证 Ubuntu、Node、Python、curl/git 等工具。 - 复用未变化的网页脚本与源码映射,避免每加载一批插件就重复拼接全部大文件;插件变更和热更新及时失效,同机连续启动约 3.1~3.4 秒。 - 启动页显示阶段耗时、插件名称、版本及实际加载错误,切换页面后仍可查看;保留上次失败输出和退出码,成功重试不再覆盖失败证据。 - 安全启动支持中止当前启动并使用独立基础界面,原插件开关、配置和会话保留;明确的插件故障可选择停用后重启。 - proroot 在鉴权前确认退出时可进行一次 proot 兼容重试;不会因等待时间长自动终止,不改用户保存的运行方式。 - 复用未变化的运行时依赖链接,避免每次注册重写脚本使工具缓存失效;修复左下角附件图标偏移。 - 修复直接重启时退出中进程的命令行变空,被误报为“无法核验本应用进程”的竞态;停止阶段复核内核退出状态,不误杀容器或其他进程。 - dsh 更新至 `0.1.5-alpha.2`,内置移动 UI 更新至 `2.4.0` 并适配官方右栏,保留新版文件预览与文件交付。 - 删除按启动次数自动备份及配置项;移除启动时的全工作区扫描,复用未变化的受管工具。 - 相同 Ubuntu 基础环境直接事务更新 dsh 和内置插件,避免重复搬迁会话、项目和第三方插件;失败可回切。 - 修复旧整数配置的类型异常;插件缺少依赖时保存已有源码并明确提示;恢复依赖使用相对链接。 - 修复旧 WebView / Gecko 的 PDF 预览兼容,新增会话删除入口沿用浏览器鉴权和来源检查。 - 双版本码 115,基础环境版本 10,保留历史发布签名。详见[版本说明](docs/releases/v1.5-alpha.2.md)。 ### v1.2.0-rc1.4 / v1.2.0-rc1.4low(预览版) 由贡献者 [@ym2025szz](https://github.com/ym2025szz) 推进,以 [GitHub Pre-release](https://github.com/DSH-APP/DSHA/releases/tag/v1.2.0-rc1.4) 发布,感谢原作者及其他贡献者。 - 同版本功能复查:安装六步检查合并探测并显示实时脱敏输出、步骤与耗时;修复静默命令超时、取消后进程残留及终端 exit 后首条输入丢失。 - “显示与运行”逐项补充作用和生效时机,接通启动更新及实际脚本更新入口;修复配置保存与 ADB 授权同步、断线重连和前台提问反馈。 - 备份与环境重建增加任务互斥和实际进程退出屏障;只省略可从 APK 补齐的原版 ADB 缓存,保留修改内容;修复更新通道来源、重建后的安装校验及阶段进度显示。见[功能验收](docs/functional-audit-rc1.4.md)。 - 同版本排版重整:统一顶部标题与返回、间距、按钮主次;设置与配置按功能分组,保存操作固定;重排插件、更新、诊断和备份页面,并完成窄屏、大字体、日夜及短视口的原生布局检查。 - 同版本主题修复:仅保留右上角白天/黑夜快捷切换,移除设置页“界面主题”区域及弹窗,修复默认按钮黑底深字、禁用文字和大字体裁切;主题切换不结束终端,版本名及版本码 113 保持不变。 - 修复四种备份范围、实际数据快照和导出校验;恢复前预检并支持失败回滚,接通启动次数自动备份。 - APK 下载可在页面关闭后继续,并保留取消/进程重建后的续传进度;插件任务增加阶段、百分比及安全取消。 - 完善插件 SemVer 与版本查询、连续启动失败恢复入口、持续运行/省电模式。 - 两种内嵌网页内核支持实际文件保存、弹层返回、图片草稿和阅读位置恢复;修复旧 WebView 启动兼容问题。 - 官网安装参数不再丢失,来源修改后撤下旧入口;增加完整参数二维码与窄屏菜单。详细记录见 [rc1.4 说明](docs/releases/v1.2.0-rc1.4.md)。 ### 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 把 `