La arquitectura central de Rust
Para garantizar una paridad absoluta entre Android e iOS y lograr el más alto nivel de rendimiento, la lógica central de Tracelet está escrita completamente en Rust. Esto incluye la máquina de estado, el motor de sincronización HTTP, la capa de persistencia de SQLite y los cálculos del presupuesto de batería.
¿Por qué oxidarse?
Escribir el motor central en Rust resuelve varios desafíos críticos en la ejecución en segundo plano multiplataforma:
- Cero discrepancias: Al confiar en una única base de código compartida en lugar de implementaciones separadas de Swift y Kotlin, garantizamos que iOS y Android se comporten de manera idéntica en todas las condiciones. Si se soluciona un error, se soluciona en todas partes.
- Simultaneidad intrépida: El motor de sincronización en segundo plano funciona perfectamente bajo cargas pesadas de subprocesos múltiples. El estricto compilador de Rust garantiza la libertad en la carrera de datos, evitando errores de concurrencia cuando las ubicaciones se registran y cargan simultáneamente en subprocesos en segundo plano.
- Rendimiento y seguridad: Rust opera con un rendimiento de nivel C y una huella de memoria casi nula, lo que lo hace perfecto para la ejecución en segundo plano con limitaciones de batería. Garantiza la seguridad de la memoria sin un recolector de basura, lo que garantiza que el motor en segundo plano nunca falle debido a punteros nulos o errores de falta de memoria.
Cómo funciona: fijaciones UniFFI
Tracelet utiliza UniFFI (Interfaz universal de función externa) de Mozilla para cerrar la brecha entre Rust y las plataformas nativas.
- Definición: Definimos la API principal en Rust (por ejemplo, métodos para iniciar el seguimiento, sincronizar datos o manejar actualizaciones de ubicación).
- Generación: UniFFI analiza automáticamente el código Rust y genera enlaces Swift seguros e idiomáticos para iOS y enlaces Kotlin para Android.
- Ejecución: Cuando el complemento Flutter llama al código nativo de iOS/Android, el código nativo llama a los enlaces generados por UniFFI, que ejecutan sin problemas la lógica subyacente de Rust.
Debido a que los enlaces se generan automáticamente, no es necesario mantener ningún código de puente JNI (Java Native Interface) ni Objective-C manual. Es completamente seguro para tipos.
Binarios precompilados (no se requiere cadena de herramientas Rust)
Un problema común con Rust en el desarrollo móvil es obligar a los desarrolladores a instalar la cadena de herramientas de Rust, configurar objetivos de compilación cruzada y soportar largos tiempos de compilación.
Tracelet soluciona este problema distribuyendo archivos binarios precompilados.
Cuando agrega el complemento tracelet a su proyecto Flutter, no necesita instalar Rust en su máquina. La canalización CI/CD de Tracelet crea y publica automáticamente las bibliotecas nativas para cada versión.
Compilación de Android
- El código Rust se compila en una biblioteca compartida nativa (
.so) para todas las arquitecturas principales de Android (arm64-v8a,armeabi-v7a,x86,x86_64). - Estas bibliotecas, junto con los enlaces Kotlin generados, se empaquetan en un archivo de Android (
.aar). - Cuando creas tu aplicación Flutter, Gradle descarga automáticamente el
.aarprediseñado desde el repositorio de Tracelet.
Compilación de iOS
- El código Rust se compila en una biblioteca estática (
.a) para dispositivos iOS (arm64) y simuladores (arm64,x86_64). - Estas bibliotecas se incluyen junto con los enlaces Swift generados en un Apple XCFramework (
TraceletCore.xcframework). - Cuando ejecuta
pod install, CocoaPods (o Swift Package Manager) descarga automáticamenteTraceletCore.xcframeworkprecompilado directamente desde la versión etiquetada de GitHub.
Esta distribución precompilada garantiza que sus compilaciones de Flutter sigan siendo increíblemente rápidas y que sus canalizaciones de CI/CD funcionen de inmediato sin necesidad de configuraciones personalizadas de Rust.