Android 层与 Rust 层分工 — UI 在 Android、逻辑在 Rust
分工原则
Android 层 = 壳,Rust 层 = 核:
| Android 层(Kotlin) | Rust 层 |
|---|---|
| Compose UI(所有界面) | 智能体核心(调度、推理) |
| 密钥安全存储(Android Keystore) | Provider trait(8 家模型) |
| 守护进程生命周期 | Channel trait(5 条通道) |
| 系统权限申请 | Tool trait(搜索、抓取、HTTP、Rhai) |
| 通知栏状态 | Memory trait(SQLite 混合搜索) |
| 文件存储权限 | Cron 定时任务 |
| 终端渲染(libghostty-vt FFI) | Terminal TTY(Rust 端) |
| Gradle 构建 | Cargo 构建 + UniFFI 桥接 |
为什么这样拆
Rust 层的优势
- 性能——8.8MB 单二进制、<5MB 内存、<10ms 冷启动
- 安全——Rust 内存安全、类型安全,AI 智能体不会因为内存错误崩掉
- 可移植——Rust 核心可以在不同平台跑(Android、Linux、macOS、Windows)
Android 层的优势
- 原生体验——Compose UI 比 WebView 壳流畅得多
- 系统集成——前台服务、通知、权限、Keystore 都是 Android 专属 API
- 安全边界——密钥只在 Android 层处理,Rust 层拿不到明文密钥
跨层通信
Android 层和 Rust 层之间的所有通信都经过 UniFFI 自动生成的 FFI 绑定。Android 层"看不到"Rust 内部实现——它只知道 Rust 暴露的接口:
// Android 层代码(概念示例)
val provider = Provider(name = "deepseek")
provider.sendMessage("帮我写个早报") { result ->
// 回调里拿到 Rust 层的处理结果
showResult(result)
}
开发流程
- 改 Rust 核心——比如新增一个 Tool 或改 Provider 路由逻辑
- 跑 UniFFI 代码生成——Gradle 自动处理
- 改 Compose UI——如果需要在界面上暴露新功能
- assembleDebug——整包构建
两个语言、两个构建系统,但统一在 Gradle 里跑——开发者不需要单独跑 Cargo。
资料来源:GitHub ZeroAI README