Skip to content

VCP Mobile v1.1.3 — Guardian Protocol

Latest

Choose a tag to compare

@MRiecy MRiecy released this 04 Jul 15:44

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
  • stopWithTaskfalse 改为 true:用户主动划掉进程后,残留锁与通知一并消亡,避免幽灵后台行为。

"邪道"音频保活与通知监听

为应对国产 ROM 激进的后台策略,v1.1.3 引入了两层兜底机制:

  1. 静音音频保活:在特定场景下播放无声音频,维持应用进程存活窗口。
  2. 通知监听服务:空逻辑监听系统通知栏变化,实现弱后台场景下的事件唤醒。

相关权限(自启动、电源管理、通知访问)均在前端设置中提供统一入口与引导。


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.gradletauri.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)

  • 修复 SseProxyService JSON 对象解析与套接字关闭异常
  • 修复用户消息重复写入
  • 修复启动超时误判
  • 修复 VCPLog 未连接时进入同步循环的问题
  • 修复 jitpack.io 仓库重复配置
  • 修复多模态硬件图片提取失败时的静默空白
  • 修复位置缓存过期时间过短的问题

优化 (Improvements)

  • 聊天历史预加载缓存与首屏渲染
  • 数据库页面大小与 VACUUM 逻辑
  • 表情包库后台维护频次
  • VCP 日志与信息连接的 URL 变更处理
  • 分布式客户端启动状态检查
  • 附件上传内存泄露与边界处理
  • 通知文案与关闭时保存逻辑

Guardian Protocol. 守护协议。
当屏幕熄灭、应用退入后台,真正的守护才刚开始运行。
—— VCP Mobile Team, July 2026