Runique
متتبع جري متقدم يزامن البيانات لحظياً بين الهاتف والساعة الذكية.
نظرة عامة
يربط Runique تطبيقاً مرافقاً على الهاتف بساعة Wear OS لتتبع الجري لحظياً. تتبع جري كامل من البداية للنهاية يعني تزامناً مستمراً للبيانات بين الساعة والهاتف المضيف، بيانات جغرافية مكانية في الوقت الفعلي، عرض خرائط، وواجهات Android Health Services.
التحدي
تطبيقات اللياقة البدنية تحتاج دقة. وضع Doze يقتل عمليات الخلفية، زمن الشبكة يتذبذب أثناء الجري، والتدفق غير المتزامن للبيانات بين الهاتف وساعة Wear OS يتسبب عادةً في مشاكل مزامنة.
كان الهدف: الحفاظ على تتبع GPS لحظي على خرائط Google مع التقاط مقاييس صحية من الساعة، دون استنزاف البطارية أو توقف النظام عند انعدام التغطية الخلوية.
القرارات المعمارية والتقنية
لضمان تدفق مثالي للبيانات، تم تنظيم مشروع Runique وفقاً لوحدات معزولة بالكامل (App, Auth, Run, Analytics, Wear) اعتماداً على نهج المعمارية النظيفة (Clean Architecture).
تحسين مسار المزامنة
- وحدات ديناميكية للميزات (Dynamic Feature Modules): تم الاعتماد على مكونات Custom Gradle Convention الإضافية لتغليف الميزات، مما عزز من سرعة بناء المشروع وخيارات النشر (Runtime Delivery).
- موثوقية العمل بلا إنترنت (Offline-First Resilience): تأسيس مصدر بيانات موثوق ومحلي عبر Room. تتدفق البيانات الحيوية من واجهة Wear OS Health Services إلى قاعدة البيانات المحلية قبل أن يرسلها Ktor كحزم مجمعة للخادم الخلفي بأمان.
- دوال Turbine و Coroutines: نظراً للتردد العالي جداً لإحداثيات الـ GPS، تم الاعتماد بشدة على مشغلات Kotlin Flow. استخدمت مكتبة Turbine في وحدات الاختبار لضمان عدم تعطل التأكيدات غير المتزامنة لحالة الواجهة أثناء مسارات CI/CD المدمجة.
الكود المشترك مقابل نطاق المنصة
عوضاً عن تكرار الكود، تُدير الطبقات الأساسية (Core Domain & Data) كلاً من استهدافات الهاتف والساعة، في حين تحقن وحدات العرض المتخصصة أنظمة تصميم فريدة باستخدام Koin لتناسب هاتف (Material 3) وتطبيق Wear OS.
الأثر والنتائج
- تزامن دون الثانية بين الساعة والهاتف لمقاييس الصحة اللحظية.
- تسجيل GPS مستمر عبر انقطاعات التغطية الخلوية ودورات وضع Doze.
- بناء أسرع بفضل dynamic feature modularization وإضافات Gradle المخصصة.