Lagoon 用得越久,一个编码会话里攒下的历史消息和工具调用记录就越长。到了 2026 年 10 月下旬,我发现每当在外面用移动网络点开一个已经聊了几十轮的大会话时,屏幕总要白屏转圈差不多 2 秒钟才能刷出来;而且输入框打字的时候,偶尔还能感觉到掉帧。

10 月 23 日到 24 日(PR #121 至 #135,v0.3.0-rc.8 至 rc.10),我专门腾出两天时间,拿性能计时器和包体积分析仪对着这两个硬指标动了刀子。

SQLite 校验型缓存:弱网打开长会话从 2000ms 降到 350ms

以前点进一个会话时,客户端每次都要老老实实向开发机拉取全量消息历史和分页数据。实测在弱网环境下,打开一个长会话要串行发出 6 次请求、传输 114KB 数据,耗时足足 2000 毫秒。其实仔细一想,AI 编码会话里那些已经结束的历史轮次根本不会再变,每次重新拉纯属浪费流量和时间。

于是我写了一套 SQLite 校验型会话缓存(TranscriptStore),把所有已完结轮次的消息结构化落盘存进手机本地的 SQLite 数据库。现在点开任何会话,界面先 0 延迟直接渲染本地缓存,让你瞬间看到聊天记录(哪怕手机完全断网也能随时翻看历史);与此同时,后台只发 1 次轻量请求拉取最新一页数据做水位核对与增量追加。实测下来,弱网首屏同步耗时直接从 2000 毫秒暴降到了 350 毫秒(仅 1 次请求、9KB 流量)。

渲染防抖与 R8 深度裁剪:APK 从 10.3MB 压到 3.6MB

解决了网络等待,第二刀砍向了界面渲染和安装包体积。我排查发现,之前在底部输入框每敲一个字,都会意外触发外层整个聊天列表的 Compose 重组;我把输入框与发送按钮的状态彻底局部化隔离,并把长篇 Markdown 的语法树解析挪到后台线程预热,滑动和打字立刻丝滑如初。

最后我又清理了冗余依赖,开启了 R8 深度代码裁剪与资源压缩,把正式版签名 APK 的体积从原来的 10.3 MB 直接压到了 3.6 MB,足足砍掉了 65% 的赘肉。