Skip to Content
Основные понятияАрхитектура ядра ржавчины

Архитектура ядра Rust

Чтобы гарантировать абсолютную совместимость между Android и iOS и достичь высочайшего уровня производительности, основная логика Tracelet полностью написана на Rust. Сюда входят конечный автомат, механизм синхронизации HTTP, уровень персистентности SQLite и расчеты бюджета батареи.


Почему Руст?

Написание основного движка на Rust решает несколько важных проблем при кроссплатформенном фоновом выполнении:

  1. Ноль несоответствий. Полагаясь на единую общую базу кода, а не на отдельные реализации Swift и Kotlin, мы гарантируем одинаковое поведение iOS и Android при любых условиях. Если ошибка исправлена, то она исправлена ​​везде.
  2. Бесстрашный параллелизм. Фоновый механизм синхронизации работает безупречно при больших многопоточных нагрузках. Строгий компилятор Rust гарантирует свободу гонок данных, избегая ошибок параллелизма, когда местоположения записываются и загружаются одновременно в фоновых потоках.
  3. Производительность и безопасность. Rust обеспечивает производительность уровня C и практически нулевое потребление памяти, что делает его идеальным для фонового выполнения с ограничением заряда батареи. Он гарантирует безопасность памяти без сборщика мусора, гарантируя, что фоновый механизм никогда не выйдет из строя из-за нулевых указателей или ошибок нехватки памяти.

Как это работает: привязки UniFFI

Tracelet использует UniFFI (универсальный интерфейс внешних функций) Mozilla, чтобы преодолеть разрыв между Rust и собственными платформами.

  1. Определение: Мы определяем основной API в Rust (например, методы для запуска отслеживания, синхронизации данных или обработки обновлений местоположения).
  2. Генерация. UniFFI автоматически анализирует код Rust и генерирует безопасные идиоматические привязки Swift для iOS и привязки Kotlin для Android.
  3. Выполнение: Когда плагин 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.