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 Native Interface) や 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 は事前にビルドされた
.aarを Tracelet リポジトリから自動的にダウンロードします。
iOS コンパイル
- Rust コードは、iOS デバイス (
arm64) およびシミュレーター (arm64、x86_64) 用の静的ライブラリ (.a) にコンパイルされます。 - これらのライブラリは、生成された Swift バインディングとともに Apple XCFramework (
TraceletCore.xcframework) にバンドルされます。 pod installを実行すると、CocoaPods (または Swift Package Manager) は、タグ付けされた GitHub リリースから直接、コンパイル済みのTraceletCore.xcframeworkを自動的にダウンロードします。
このコンパイル済みディストリビューションにより、Flutter ビルドが超高速に維持され、カスタム Rust セットアップを必要とせずに CI/CD パイプラインがすぐに動作することが保証されます。