VCP Mobile v1.1.3 — Guardian Protocol
"当应用退入后台,守护才刚刚开始。"
写在前面
v1.1.3 是一个以后台可靠性与连接可持续性为核心的维护版本。从 1.1.2 到 1.1.3,代码库经历了 66 次提交,覆盖 Rust 后端、Android 原生层、Vue 前端与工程 CI 四个层面。它没有 1.1.0 那种渲染引擎级别的视觉重构,但它在移动端最痛的场景——应用被划掉、系统 Doze、网络切换、锁屏熄网——做了大量沉默而关键的加固。
如果用一个词概括这个版本——守护。
1. 后台保活:从野路子到体系化
ForegroundGuardian 进程级单例
Android 后台保活机制在 v1.1.3 中完成了重大重构:
- 旧方案:
StreamKeepaliveService自行持有WakeLock/WifiLock,不同功能各自申请,极易重复、泄漏或竞争。 - 新方案:引入
ForegroundGuardian(Kotlin 进程级单例),统一管理所有前台服务、WakeLock、WifiLock 的引用计数与四级优先级调度:
| 优先级 | 场景 | 数值 |
|---|---|---|
SYNC |
数据同步 | 40 |
PRERENDER |
预渲染缓存 | 30 |
STREAM |
流式对话 | 20 |
DISTRIBUTED |
分布式节点 | 10 |
任何模块通过 acquire(tag, priority, label, screenKeepOn) / release(tag) 申请或释放锁。Guardian 会根据当前最高优先级动态调整通知文案与锁策略,避免多模块同时保活时的资源浪费。
StreamKeepaliveService 降级为通知壳
- v1.1.2 中
StreamKeepaliveService同时负责锁管理与通知展示。 - v1.1.3 中它只负责维持合法的前台服务通知,WakeLock / WifiLock 全部移交 ForegroundGuardian。
- 仍使用
START_STICKY+IMPORTANCE_HIGH+FOREGROUND_SERVICE_TYPE_REMOTE_MESSAGING。 stopWithTask从false改为true:用户主动划掉进程后,残留锁与通知一并消亡,避免幽灵后台行为。
"邪道"音频保活与通知监听
为应对国产 ROM 激进的后台策略,v1.1.3 引入了两层兜底机制:
- 静音音频保活:在特定场景下播放无声音频,维持应用进程存活窗口。
- 通知监听服务:空逻辑监听系统通知栏变化,实现弱后台场景下的事件唤醒。
相关权限(自启动、电源管理、通知访问)均在前端设置中提供统一入口与引导。
2. SSE 代理进程:让流式对话活过应用切换
隔离进程 SSE 代理
v1.1.3 新增 VCP Mobile SSE 代理进程(SseProxyService),作为独立进程运行:
- 主应用切后台或被系统冻结时,SSE 连接由代理进程继续持有,避免长连接被系统中断。
- 代理进程与主应用通过 本地 TCP 套接字 通信,全内存缓冲,长度前缀传输,降低 IPC 序列化开销。
- 支持流式恢复:应用从后台切回前台后,可接续已建立的 SSE 会话,无需重新触发模型生成。
溢出与并发安全
- 修复
SseProxyService中 JSON 对象处理逻辑,避免内容解析异常。 - 修复关闭套接字输出流时的潜在异常。
- 引入并发安全锁,避免静音文件被多个模块重复创建。
- SHA-256 哈希文件命名,消除缓存文件名冲突。
- 无活跃连接时,服务主动退出前台并停止,拒绝无意义常驻。
3. 生命周期与状态管理
进程级生命周期监听
LifecycleBridge 从单 Activity 级观察升级为 进程级观察(ProcessLifecycleOwner):
- 更准确感知应用前后台切换。
- 避免因 Activity 重建导致的重复 / 丢失生命周期事件。
- 前后台切换时自动触发流式恢复、心跳间隔调整与分布式节点状态同步。
启动超时与连接状态
- 修复启动超时判断逻辑,避免正常启动被误判为卡死。
- 增加
VCPLog连接状态检查,未连接时不再盲目进入同步主循环。 - 优化 VCP 日志与信息连接的 URL 变更处理,设备名称自动附加到日志 URL。
分布式客户端
- 启动时增加状态检查,避免在无效状态下创建监听器。
- 重构监听器创建逻辑,杜绝重复注册。
- 分布式工具统一使用 telemetry state,状态感知更准确。
4. 消息与历史加载优化
聊天历史首屏渲染
- 添加预加载缓存,提升首屏消息列表渲染速度。
- 移除不必要的性能日志,简化加载逻辑。
- 优化指示灯显示,减少视觉干扰。
消息正确性
- 修复用户消息重复写入问题。
- 实现级联逻辑删除:删除代理、群组或话题时,相关消息统一标记为删除。
- 优化附件上传的内存泄露与边界处理。
- 多模态硬件图片提取失败时增加警告提示,避免静默空白内容。
头像与缓存
- 新增批量获取头像接口,优化头像预加载逻辑。
- 动态话题标题与头像目标属性支持。
- 表情包库刷新增加后台维护任务频次控制,避免过度刷盘。
数据库
- 优化数据库初始化中的页面大小处理。
- 改进
VACUUM逻辑,降低碎片整理时的卡顿。
5. 通知系统增强
- 新增通知点击处理:点击通知可从 pending intent 中获取待处理数据并更新应用状态。
- 新增获取待处理通知的权限支持。
- 设置保存失败时通过通知提示用户。
- 优化关闭时的保存逻辑,减少数据丢失风险。
6. 工程与质量
测试框架
v1.1.3 首次在前端引入了结构化测试体系:
vitest单元测试覆盖组件与工具函数。tests/e2e-android/提供基于 ADB 的 Android 冒烟测试脚本。tests/perf/提供 APK 体积、启动耗时、Rust benchmark 采集脚本。
Android 构建与 CI
- 初始化并完善 Android 项目配置:
- 添加
tauri.settings.gradle与tauri.build.gradle.kts。 - 安装 Android NDK 并确保 CI 中
gradlew可执行。 - 修复
jitpack.io仓库重复配置。
- 添加
- 优化 CI 流程。
- 修正
tsconfig.json路径配置。
文档同步
- 完成 v1.1.3 全量文档同步与源码标注。
- 修复 Rust 编译相关文档描述。
- 更新
AGENTS.md至 v1.1.3。
7. 完整变更清单
新增 (Features)
- ForegroundGuardian 进程级前台服务与锁管理单例
- SSE 代理进程与本地 TCP 套接字 IPC
- 静音音频保活与通知监听服务
- 通知点击处理与待处理数据恢复
- 进程级生命周期监听 (
ProcessLifecycleOwner) - 批量头像获取与预加载优化
- 前端单元测试、Android e2e 与性能测试框架
- 自启动 / 电源管理 / 通知访问权限引导
修复 (Fixes)
- 修复
SseProxyServiceJSON 对象解析与套接字关闭异常 - 修复用户消息重复写入
- 修复启动超时误判
- 修复 VCPLog 未连接时进入同步循环的问题
- 修复
jitpack.io仓库重复配置 - 修复多模态硬件图片提取失败时的静默空白
- 修复位置缓存过期时间过短的问题
优化 (Improvements)
- 聊天历史预加载缓存与首屏渲染
- 数据库页面大小与 VACUUM 逻辑
- 表情包库后台维护频次
- VCP 日志与信息连接的 URL 变更处理
- 分布式客户端启动状态检查
- 附件上传内存泄露与边界处理
- 通知文案与关闭时保存逻辑
Guardian Protocol. 守护协议。
当屏幕熄灭、应用退入后台,真正的守护才刚开始运行。
—— VCP Mobile Team, July 2026