9.9 KiB
LineUp Client 与 Mini Runtime 技术选型:原生 Android、Tauri 2 与 Wails v3
版本: 0.1(评审稿)
状态: 已确认第一阶段技术路线
日期: 2026-08-02 关联设计: LineUp App 层架构设计方案、LineUp UI Surface 与 App Capability 协议
1. 决策问题
LineUp 已有可运行的 Kotlin Android 客户端,并完成 App Server、WuKongIM、Hermes Adapter 的连通。它的定位是快速验证 IM、协议、设备接入和交互闭环,不是长期多端客户端的唯一实现。
长期目标是在 App 层建立 LineUp 自定义的“小程序运行环境”:利用系统 WebView / WebKit 执行 HTML、CSS、JavaScript,但由 LineUp 定义小程序包、生命周期、受限桥接、事件协议、权限与审计模型。这里不实现浏览器或 JavaScript 内核;实现的是运行在系统 Web 内核之上的 LineUp Mini Runtime。
本次只讨论客户端实现载体;LineUp Envelope、Interaction Kernel、Surface 安全模型与 Capability Registry 的协议边界不因载体而改变。
2. 已确认的技术路线
| 选项 | 决策 | 定位 |
|---|---|---|
| 现有 Kotlin Android | 保留 | 稳定基线、原生能力参考实现和持续交付通道 |
| Tauri 2 | 第一优先开展独立 Spike | LineUp Mini Runtime 的 Reference Host、安全与能力基线 |
| Wails v3 | 第二阶段按同一基线评估 | 利用 Go 主技术栈的长期 Host 候选 |
不直接重写或删除当前 Kotlin App。先通过 Tauri Spike 验证跨端 Host、小程序隔离、系统能力桥接和移动端恢复;再以完全相同的 Mini Runtime 协议与验收标准验证 Wails v3。这样可将技术选择从框架偏好转为可实证的交付能力比较。
2.1 为什么先验证 Tauri
Tauri 的团队、社区、桌面生态和移动端路径相对成熟,适合作为高标准的参考宿主。它先回答的不是“能否把现有 Android 聊天页换成 Web”,而是“可信 LineUp 主应用与不可信小程序 Surface 能否在多端稳定且安全地共存”。
Wails v3 与 Go 主技术栈更匹配,仍是重要的长期候选;但它应接受已验证的 Runtime 基线,而不是由它当前的 Beta 状态来定义平台边界。
3. 当前资产与迁移匹配度
Web Reference Host 已存在下列可复用资产:
lineup-app-server/assets/chat/
├── interaction-kernel.js # ConversationItemFactory + RendererRegistry
└── index.html # GFM Markdown、安全净化、Surface Host、App Call UI
可复用的核心能力包括:
marked + DOMPurify的 GFM Markdown;ConversationItem与 Renderer Registry;lineup.v1.text、agent.status、agent.progress、errorrenderer;lineup.v1.ui.open / patch / close / event的 sandbox iframe Surface Host;lineup.v1.app.call / result的用户确认交互;- WebSocket 接入形态(服务端 WSS 尚待提供;当前 Android 是 HTTP 轮询)。
目前 Android 使用 OkHttp、RecyclerView、Clipboard、外链 Intent、Activity 生命周期和轮询,不依赖相机、蓝牙、音视频等重量级原生 SDK。故迁移“表现层与会话 UI”的阻力较低,但系统能力、推送和后台恢复仍必须有原生实现。
4. 方案对比
| 维度 | 当前 Kotlin Android | Tauri 2 | Wails v3 |
|---|---|---|---|
| Android UI | 原生 View / RecyclerView | Web 前端 + Android WebView | Web 前端 + 容器;移动端路径需进一步证实 |
| Markdown | 临时 regex + HtmlCompat,不完整 | 直接复用 GFM + sanitizer | 可复用 Web 实现 |
| LineUp Surface | 当前仅原生 Task Dashboard | 可复用 iframe sandbox Host | 需要专项验证 |
| 内置 Renderer / 标准组件 | 需逐个原生实现 | 可复用现有 Web Renderer | 可复用现有 Web Renderer |
| 系统能力 | Kotlin 直接调用 | Tauri Plugin / Kotlin bridge | Go bridge / 原生层,需专项验证 |
| Push、通知、后台、Deep Link | 路径最直接 | 仍需要原生 Plugin | 仍需要原生 bridge |
| Android 成熟度 | 已在项目真机运行 | 官方 Mobile 路径,作为首个真机 Spike | 官方 README 标为 v3 Beta,需以 Tauri 结果作对照 |
| 现有 Web 实现复用 | 低 | 高 | 高 |
| 推荐角色 | 稳定基线 | Reference Host / 第一优先 Spike | Go 主栈长期候选 / 第二阶段对照实现 |
4.1 Tauri 2:Reference Host
Tauri 2 是当前最适合优先验证的跨端候选。官方 v2 文档覆盖 Android、iOS 与 Mobile;它能够复用已有 Web 表现层资产,同时仍允许通过原生插件承接 Android 系统能力。Tauri 在本项目中承担的是可信 LineUp 主应用与 Mini Runtime 的第一版参考实现,而不是第三方小程序本身。
它替换的是会话 UI、Markdown、Renderer、标准组件和 Surface Host,并非把 Android 原生层完全移除。Kotlin/Gradle 仍承担推送、通知、Deep Link、运行时权限、文件选择、分享、后台恢复,以及必要原生 Plugin。
4.2 Wails v3:Go Host 候选
Wails 的 Go 技术栈与 LineUp 的服务端、协议校验、同步、Outbox、Capability Policy 和审计逻辑高度匹配,长期上有明显的维护优势。官方 GitHub README 当前将 Wails v3 标记为 Beta;本次核验也没有取得足够的官方 Android 生产支持证据。因此不把它作为第一轮 Runtime 安全边界的验证载体,但在 Tauri 基线明确后,应以同一协议和验收范围做正式对照实现。
重点评估 Wails v3 是否能以 Go Host 达到 Tauri Reference Host 的小程序隔离、资源加载、桥接、生命周期、移动端系统能力与恢复标准;若能达到,Go 主栈优势将使其成为长期主方案的强候选。
5. LineUp Mini Runtime 与 Tauri Reference Host
LineUp Tauri Reference Host
├── Web Frontend
│ ├── Chat UI / 虚拟列表
│ ├── CommonMark / GFM Markdown
│ ├── ConversationItem + Renderer Registry
│ ├── 标准组件库
│ ├── Surface Host
│ └── WebSocket + HTTP 补偿
├── Rust / Tauri Core
│ ├── 安全 capability policy
│ ├── 会话 / token 安全存储
│ └── 原生 bridge 管理
└── Android Kotlin 壳
├── Push / 通知 / Deep Link
├── 文件、权限、系统分享
└── 必要的原生 Plugin
Tauri 的 Web Frontend 与第三方 Surface 必须是两个不同的安全域。LineUp 自有前端可以调用受控原生能力;Agent 或第三方 Surface 只能通过经过校验的事件协议请求能力,绝不能获得 Tauri invoke、登录 token 或宿主 DOM 的直接访问权。
5.1 Mini Runtime 的框架无关边界
Mini Runtime 是可被 Tauri、Wails 或原生 Shell 实现的协议层,最小由以下模块组成:
Package Manager app_id / version / manifest / integrity / allowlist
Instance Manager instance_id / open / ready / patch / close / restore
Secure Loader 不可变 bundle / 专用 origin / CSP / 网络与跳转限制
Event Bridge postMessage schema、大小、频率、来源与实例校验
Mini API ui.onPatch / ui.emit / app.call / app.result
Capability Gateway policy / 用户确认 / 平台 handler / audit
第三方小程序只能获得 Mini API,不能直接获得 Tauri 或 Wails 的原生调用对象。内置 Renderer 与标准组件可运行于可信主应用前端;小程序 Surface 则必须运行于隔离执行域。
6. 不可退让的安全约束
- Agent bundle 与第三方 Surface 一律视为不可信输入。
- Surface iframe 不得访问 Tauri invoke API、宿主登录态或宿主 DOM。
- 仅允许完成实例、命名空间、事件名和消息大小校验的
postMessagebridge。 - CSP 默认禁止未授权网络、远程脚本和危险跳转。
ui.patch只能更新 JSON state,不能替换已验证 bundle。- 所有系统能力只允许走
app.call → Capability Registry → 用户确认 → app.result。 - Android 的推送、通知、后台恢复与权限结果必须可审计、可恢复,不能依赖一个不受控网页生命周期。
7. Tauri Reference Host Spike 范围与验收
Spike 单独建立目录或模块,接入同一 App Server、WuKongIM、Hermes 与测试会话;不得改写当前 Kotlin Android 的可运行路径。先以桌面验证主应用与小程序双安全域,再进入 Android 真机验证。
- 真机登录现有 App Server;
- 兼容 HTTP
/messages/sync,为服务端 WSS 留出接入点; - 完整 GFM Markdown 与 DOMPurify 安全净化;
- 兼容
text / status / progress / tool.call / tool.result; - 实现
ui.open / patch / close / eventsandbox Surface; - 实现
app.open_url与clipboard.write的 Capability bridge; - PJD110 真机安装、滚动性能、断线恢复与安全隔离通过;
- 与既有 Kotlin 客户端对照确认消息顺序、去重、用户操作回传一致。
Wails v3 的第二阶段 Spike 使用以上相同清单。其目标不是重定义协议,而是证明 Go Host 能够以相同小程序包和安全边界完成等价交付。
8. 本机构建级验证前置条件
| 条件 | 当前状态 |
|---|---|
| Android SDK / Gradle / 项目内 JDK 17 | 已有 |
| Kotlin APK 构建与真机安装 | 已验证 |
| Rust / Cargo | 已安装;本机 Rustup proxy 有清单异常,直接工具链 bin 可用 |
| Tauri CLI | 已作为 lineup-app/tauri/ 的 npm 开发依赖安装 |
| Wails CLI | 未安装 |
| Android NDK | 未安装 |
| Tauri / Wails 现有工程 | Tauri Reference Host 已建立于 lineup-app/tauri/;Wails 尚未建立 |
Tauri Spike 已进入实现阶段:前端生产构建、Linux debug 二进制和 Debian 包均已生成;Android 真机 Spike 仍需 Android NDK 与 Rust Android targets。当前 Kotlin Android 实验工程保持不变。