UniFFI 桥接层 — Kotlin 和 Rust 安全互通
UniFFI 是什么
UniFFI 是 Mozilla 开发的跨语言 FFI(Foreign Function Interface)工具——它的目标是:
用 Rust 写业务逻辑,自动生成其他语言的绑定代码。
Mozilla 自己在 Firefox、Firefox for Android、Rust 组件中大量使用。ZeroAI 选择它而不是手写 FFI。
为什么不用手写 FFI
手写 Kotlin ↔ Rust FFI 的坑多到数不清:
- 内存管理——谁 alloc?谁 free?忘记 free = 内存泄漏,double free = 崩溃
- 类型映射——Kotlin 的 String 和 Rust 的 String 在内存里完全不同,需要手动转换
- 线程模型——Kotlin 的协程和 Rust 的 async/await 怎么桥接?
- 生命周期——Kotlin 对象被 GC 了,Rust 那边还在引用怎么办?
手写 FFI 容易写出"能跑但不稳定"的代码——尤其 ZeroAI 要支持 8 家模型供应商、5 条通道、24 项安全开关,手动维护根本不现实。
UniFFI 做了什么
ZeroAI 仓库里 UniFFI 桥接层在 zeroclaw-android/zeroclaw-ffi/ 目录:
- 用 UDL 描述接口——类似接口定义语言,告诉 UniFFI Rust 侧暴露了哪些函数/类/结构体
- 自动生成 Rust 侧 FFI——把 Rust 函数包装成 C 兼容接口
- 自动生成 Kotlin 侧绑定——生成 Kotlin 类/函数,内部调用 C FFI
- 类型安全——String、Int、Vec、Option、Result 等常见类型都有正确映射
- 内存安全——UniFFI 生成的代码自动管理内存,不会泄漏也不会 double free
开发者构建
README 里提到:
./gradlew :app:assembleDebug
UniFFI 代码生成是 Gradle 构建流程的一部分——不需要手动跑 UniFFI 命令,改了 Rust 接口声明后直接 assembleDebug 就行。
两层桥接之外
除了 UniFFI 自动生成的绑定,ZeroAI README 还提到:
The terminal subsystem's safe Rust FFI wrappers were informed by patterns from libghostty-rs
终端渲染层自己写了一套 FFI 来对接 libghostty-vt——这部分是手写的,因为 UniFFI 还不支持终端渲染这种复杂场景。
资料来源:GitHub ZeroAI README、UniFFI 官方文档