Архитектура ядра Rust
Чтобы гарантировать абсолютную совместимость между Android и iOS и достичь высочайшего уровня производительности, основная логика Tracelet полностью написана на Rust. Сюда входят конечный автомат, механизм синхронизации HTTP, уровень персистентности SQLite и расчеты бюджета батареи.
Почему Руст?
Написание основного движка на Rust решает несколько важных проблем при кроссплатформенном фоновом выполнении:
- Ноль несоответствий. Полагаясь на единую общую базу кода, а не на отдельные реализации Swift и Kotlin, мы гарантируем одинаковое поведение iOS и Android при любых условиях. Если ошибка исправлена, то она исправлена везде.
- Бесстрашный параллелизм. Фоновый механизм синхронизации работает безупречно при больших многопоточных нагрузках. Строгий компилятор Rust гарантирует свободу гонок данных, избегая ошибок параллелизма, когда местоположения записываются и загружаются одновременно в фоновых потоках.
- Производительность и безопасность. Rust обеспечивает производительность уровня C и практически нулевое потребление памяти, что делает его идеальным для фонового выполнения с ограничением заряда батареи. Он гарантирует безопасность памяти без сборщика мусора, гарантируя, что фоновый механизм никогда не выйдет из строя из-за нулевых указателей или ошибок нехватки памяти.
Как это работает: привязки UniFFI
Tracelet использует UniFFI (универсальный интерфейс внешних функций) Mozilla, чтобы преодолеть разрыв между Rust и собственными платформами.
- Определение: Мы определяем основной API в Rust (например, методы для запуска отслеживания, синхронизации данных или обработки обновлений местоположения).
- Генерация. UniFFI автоматически анализирует код Rust и генерирует безопасные идиоматические привязки Swift для iOS и привязки Kotlin для Android.
- Выполнение: Когда плагин Flutter вызывает собственный код iOS/Android, собственный код вызывает сгенерированные UniFFI привязки, которые беспрепятственно выполняют базовую логику Rust.
Поскольку привязки генерируются автоматически, не требуется вручную поддерживать JNI (собственный интерфейс Java) или код моста Objective-C. Он полностью типобезопасен.
Предварительно скомпилированные двоичные файлы (Rust Toolchain не требуется)
Общая проблема Rust в мобильной разработке — это то, что разработчикам приходится устанавливать набор инструментов Rust, настраивать цели кросс-компиляции и терпеть длительное время сборки.
Tracelet решает эту проблему, распространяя предварительно скомпилированные двоичные файлы.
Когда вы добавляете плагин tracelet в свой проект Flutter, вам не нужно устанавливать Rust на свой компьютер. Конвейер CI/CD Tracelet автоматически создает и публикует собственные библиотеки для каждого выпуска.
Android-подборка
- Код Rust скомпилирован в собственную общую библиотеку (
.so) для всех основных архитектур Android (arm64-v8a,armeabi-v7a,x86,x86_64). - Эти библиотеки вместе с созданными привязками Kotlin упаковываются в архив Android (
.aar). - Когда вы создаете приложение Flutter, Gradle автоматически загружает предварительно созданный
.aarиз репозитория Tracelet.
iOS-компиляция
- Код Rust скомпилирован в статическую библиотеку (
.a) для iOS-устройств (arm64) и симуляторов (arm64,x86_64). - Эти библиотеки объединяются вместе со сгенерированными привязками Swift в Apple XCFramework (
TraceletCore.xcframework). - Когда вы запускаете
pod install, CocoaPods (или диспетчер пакетов Swift) автоматически загружает предварительно скомпилированныйTraceletCore.xcframeworkнепосредственно из помеченного выпуска GitHub.
Этот предварительно скомпилированный дистрибутив гарантирует, что ваши сборки Flutter будут молниеносно быстрыми, а ваши конвейеры CI/CD будут работать «из коробки», не требуя специальных настроек Rust.