Rust 核心架构
为了保证Android和iOS之间的绝对对等并达到最高水平的性能,Tracelet的核心逻辑完全用Rust编写。这包括状态机、HTTP 同步引擎、SQLite 持久层和电池预算计算。
为什么生锈?
用 Rust 编写核心引擎解决了跨平台后台执行中的几个关键挑战:
- 零差异: 通过依赖单个共享代码库而不是单独的 Swift 和 Kotlin 实现,我们确保 iOS 和 Android 在所有条件下表现相同。如果错误被修复,那么所有地方都被修复了。
- 无畏并发: 后台同步引擎在繁重的多线程负载下完美运行。 Rust 严格的编译器保证数据竞争自由,避免在后台线程上同时记录和上传位置时出现并发错误。
- 性能和安全性: Rust 具有 C 级性能和接近于零的内存占用,使其非常适合电池受限的后台执行。它无需垃圾收集器即可保证内存安全,确保后台引擎不会因空指针或内存不足错误而崩溃。
工作原理:UniFFI 绑定
Tracelet 使用 Mozilla 的 UniFFI(通用外部函数接口)来弥合 Rust 和本机平台之间的差距。
- 定义: 我们在 Rust 中定义核心 API(例如,开始跟踪、同步数据或处理位置更新的方法)。
- 生成: UniFFI 自动解析 Rust 代码并为 iOS 生成安全、惯用的 Swift 绑定,为 Android 生成 Kotlin 绑定。
- 执行: 当 Flutter 插件调用原生 iOS/Android 代码时,原生代码会调用 UniFFI 生成的绑定,从而无缝执行底层 Rust 逻辑。
由于绑定是自动生成的,因此无需手动维护 JNI(Java 本机接口)或 Objective-C 桥接代码。它是完全类型安全的。
预编译的二进制文件(无需 Rust 工具链)
Rust 在移动开发中的一个常见痛点是迫使开发人员安装 Rust 工具链、配置交叉编译目标并忍受较长的构建时间。
Tracelet 通过分发预编译的二进制文件解决了这个问题。
当您将 tracelet 插件添加到 Flutter 项目中时,您不需要在计算机上安装 Rust。 Tracelet 的 CI/CD 管道会自动构建并发布每个版本的本机库。
安卓编译
- Rust 代码被编译为适用于所有主要 Android 架构(
arm64-v8a、armeabi-v7a、x86、x86_64)的本机共享库(.so)。 - 这些库与生成的 Kotlin 绑定一起打包到 Android 存档 (
.aar) 中。 - 当您构建 Flutter 应用程序时,Gradle 会自动从 Tracelet 存储库下载预构建的
.aar。
iOS编译
- Rust 代码被编译成适用于 iOS 设备 (
arm64) 和模拟器 (arm64、x86_64) 的静态库 (.a)。 - 这些库与生成的 Swift 绑定一起捆绑到 Apple XCFramework (
TraceletCore.xcframework) 中。 - 当您运行
pod install时,CocoaPods(或 Swift Package Manager)会自动直接从标记的 GitHub 版本下载预编译的TraceletCore.xcframework。
⚡
这种预编译的发行版可确保您的 Flutter 构建保持闪电般的速度,并且您的 CI/CD 管道开箱即用,无需自定义 Rust 设置。