421 lines
16 KiB
Markdown
421 lines
16 KiB
Markdown
# تحليل استهلاك البطارية وأداء التطبيق — سيرو
|
|
## Battery & Performance Analysis — Siro Platform
|
|
|
|
> **النسخة:** 1.0 | **تاريخ:** يوليو 2026 | **التصنيف:** داخلي
|
|
|
|
---
|
|
|
|
## 📋 فهرس المحتويات
|
|
1. [ملخص الأداء العام](#1-ملخص-الأداء-العام)
|
|
2. [تحليل استهلاك البطارية بالتفصيل](#2-تحليل-استهلاك-البطارية-بالتفصيل)
|
|
3. [نظام GPS المتكيف](#3-نظام-gps-المتكيف)
|
|
4. [تحسين الذاكرة والأداء](#4-تحسين-الذاكرة-والأداء)
|
|
5. [تحسين الشبكة والاتصالات](#5-تحسين-الشبكة-والاتصالات)
|
|
6. [تصنيف فئات الأجهزة](#6-تصنيف-فئات-الأجهزة)
|
|
7. [الخدمات الخلفية (Background Services)](#7-الخدمات-الخلفية)
|
|
8. [نقاط الضعف والتوصيات](#8-نقاط-الضعف-والتوصيات)
|
|
9. [خطة التحسين المقترحة](#9-خطة-التحسين-المقترحة)
|
|
|
|
---
|
|
|
|
## 1. ملخص الأداء العام
|
|
|
|
### التقييم الإجمالي: ⭐⭐⭐⭐☆ (8/10)
|
|
|
|
| المجال | التقييم | ملاحظات |
|
|
|--------|---------|---------|
|
|
| استهلاك البطارية (GPS) | ⭐⭐⭐⭐☆ | نظام متكيف جيد، يحتاج تحسينات |
|
|
| استهلاك البطارية (خلفية) | ⭐⭐⭐⭐⭐ | معماري ممتاز — لا GPS في الخلفية |
|
|
| سرعة التطبيق | ⭐⭐⭐⭐☆ | GetX سريع، لكن بدء التشغيل بطيء |
|
|
| استهلاك الذاكرة | ⭐⭐⭐⭐☆ | Lazy loading، Buffer limits |
|
|
| حجم التطبيق | ⭐⭐⭐☆☆ | كبير نسبياً (Flutter + حزم كثيرة) |
|
|
| الشبكة والاتصالات | ⭐⭐⭐⭐⭐ | Caching ممتاز، Socket ذكي |
|
|
| الخدمات الخلفية | ⭐⭐⭐⭐⭐ | Foreground Service محسن |
|
|
|
|
---
|
|
|
|
## 2. تحليل استهلاك البطارية بالتفصيل
|
|
|
|
### 2.1 الحزم المستخدمة
|
|
|
|
| الحزمة | الاستخدام | التأثير على البطارية |
|
|
|---------|-----------|----------------------|
|
|
| `battery_plus: ^7.0.0` | مراقبة مستوى البطارية | 🟢 Minimal |
|
|
| `wakelock_plus:` | إبقاء الشاشة قيد التشغيل | 🟡 مشغل دائم — يحتاج تحسين |
|
|
| `flutter_background_service: ^5.1.0` | خدمة الخلفية | 🟢 محسّن بشكل معماري |
|
|
| `location: ^8.0.0` | تتبع GPS | 🟡 عالي لكن مع تحسينات |
|
|
| `native_geofence: ^1.1.0` | Geofencing | 🟢 Hardware-level — ممتاز |
|
|
|
|
### 2.2 أوضاع استهلاك الطاقة
|
|
|
|
#### الوضع الطبيعي (بطارية > 25%)
|
|
```
|
|
GPS Interval: 5 ثوانٍ
|
|
Distance Filter: 10 متر
|
|
Upload Batch: كل دقيقتين
|
|
Record Timer: كل 3 ثوانٍ
|
|
Heartbeat: كل 25 ثانية (يتخطى إذا GPS نشط)
|
|
WakeLock: مفعل
|
|
```
|
|
|
|
#### وضع توفير الطاقة (بطارية ≤ 20%)
|
|
```
|
|
GPS Interval: 10 ثوانٍ ← توفير 50%
|
|
Distance Filter: 20 متر ← توفير 50%
|
|
Upload Batch: كل 5 دقائق ← توفير 60%
|
|
Record Timer: كل 10 ثوانٍ ← توفير 70%
|
|
Heartbeat: كل 25 ثانية
|
|
WakeLock: مفعل (بدون تغيير)
|
|
يدخل تلقائياً عند 20%، يخرج عند 25%
|
|
```
|
|
|
|
### 2.3 تأثير كل تقنية على البطارية
|
|
|
|
| التقنية | الوضع الطبيعي | توفير الطاقة | التوفير |
|
|
|---------|---------------|---------------|---------|
|
|
| GPS Polling | 5s | 10s | ~40% أقل استهلاك |
|
|
| Distance Filter | 10m | 20m | ~30% أقل تحديثات |
|
|
| Upload Frequency | 2min | 5min | ~60% أقل طلبات |
|
|
| Record Frequency | 3s | 10s | ~70% أقل تسجيل |
|
|
| Heartbeat | 25s | 25s | يتخطى إذا GPS نشط |
|
|
|
|
---
|
|
|
|
## 3. نظام GPS المتكيف
|
|
|
|
### 3.1 خوارزمية التحكم بالموقع (LocationController)
|
|
- **841 سطر** — ملف التحكم الرئيسي بالموقع
|
|
- **Single Source of Truth**: لا يوجد مصدر آخر للموقع في التطبيق
|
|
- **Background Service بدون GPS**: قاعدة معمارية صارمة — الخدمة الخلفية تشغل Socket فقط
|
|
|
|
### 3.2 تسجيل المسار الذكي
|
|
```dart
|
|
// يُسجل فقط إذا:
|
|
// 1. تحرك أكثر من 10 أمتار AND سرعة > 0.5 م/ث
|
|
// 2. أو مر 60 ثانية بدون تسجيل (force record)
|
|
if ((moved && speed > 0.5) || timeForced) {
|
|
_trackBuffer.add(point);
|
|
}
|
|
```
|
|
|
|
### 3.3 Batch Upload
|
|
```
|
|
Buffer: يخزن حتى 500 نقطة
|
|
Upload: كل 2-5 دقائق (حسب وضع الطاقة)
|
|
Batch Size: حتى 100 نقطة لكل طلب
|
|
SQLite: Flush كل 10 نقاط سلوكية
|
|
```
|
|
|
|
### 3.4 Heartbeat الذكي
|
|
```dart
|
|
// Heartbeat كل 25 ثانية، لكن:
|
|
// إذا GPS stream نشط → يتخطى Heartbeat بالكامل
|
|
if (_locSub != null) return; // Skip if GPS stream is active
|
|
```
|
|
|
|
### 3.5 Socket Watchdog
|
|
```dart
|
|
// فحص الاتصال كل 3 ثوانٍ
|
|
// يعيد الاتصال فقط إذا انقطع
|
|
// يمنع إعادة اتصال متزامنة
|
|
if (!isSocketConnected && !_isInitializingSocket) {
|
|
initSocket();
|
|
}
|
|
```
|
|
|
|
### 3.6 إدارة دورة حياة التطبيق
|
|
```dart
|
|
// عندما التطبيق في المقدمة → يوقف Background Service
|
|
// عندما التطبيق في الخلفية → يشغل Background Service
|
|
// iOS: لا يشغل Background Service أبداً
|
|
```
|
|
|
|
---
|
|
|
|
## 4. تحسين الذاكرة والأداء
|
|
|
|
### 4.1 GetX Lazy Loading
|
|
|
|
```dart
|
|
// Permanent (في الذاكرة دائماً):
|
|
Get.put(LocaleController());
|
|
Get.put(MapSocketController(), permanent: true);
|
|
Get.put(MapEngineController(), permanent: true);
|
|
|
|
// Lazy (ينشأ عند أول استخدام فقط):
|
|
Get.lazyPut(() => LoginController(), fenix: true);
|
|
Get.lazyPut(() => NotificationController(), fenix: true);
|
|
Get.lazyPut(() => VoiceCallController(), fenix: true);
|
|
```
|
|
|
|
### 4.2 Buffer Limits
|
|
```
|
|
Track Buffer: حد أقصى 500 نقطة (يحذف الأقدم)
|
|
Behavior Buffer: Flush إلى SQLite كل 10 نقاط
|
|
Error Log: Debounce دقيقة واحدة لنفس الخطأ
|
|
Image Upload: ضغط 70% + حد أقصى 1024x1024
|
|
Map Icons: تصغير إلى 120x120 في Isolate منفصل
|
|
```
|
|
|
|
### 4.3 Caching
|
|
| البيانات | مكان التخزين | مدة الصلاحية |
|
|
|----------|--------------|--------------|
|
|
| إحصائيات الأسبوع | GetStorage | 3 ساعات |
|
|
| مسار الرحلة (Cached Route) | GetStorage | حتى رحلة جديدة |
|
|
| قائمة الفيديوهات | GetStorage | غير محدد |
|
|
| قائمة الرحلات المتاحة | GetStorage | 5 ثوانٍ |
|
|
| Device Tier | GetStorage | 24 ساعة |
|
|
| الخرائط الأوفلاين | SQLite | 10km radius |
|
|
|
|
### 4.4 Image Optimization Pipeline
|
|
```dart
|
|
// خطوة 1: تدوير الصورة تلقائياً (Auto-rotate)
|
|
// خطوة 2: قص المستند (Auto-crop)
|
|
// خطوة 3: ضغط إلى 70% جودة
|
|
// خطوة 4: تصغير إلى 1024x1024
|
|
// خطوة 5: رفع مع 3 محاولات + Exponential Backoff
|
|
```
|
|
|
|
---
|
|
|
|
## 5. تحسين الشبكة والاتصالات
|
|
|
|
### 5.1 SSL Pinning
|
|
- جميع الاتصالات HTTPS مع SSL Pinning
|
|
- يمنع هجمات Man-in-the-Middle
|
|
- JWT مع Validate قبل كل طلب (30s buffer)
|
|
|
|
### 5.2 Connectivity Guard
|
|
```dart
|
|
// قبل كل طلب → تحقق من الاتصال
|
|
final connectivityResult = await Connectivity().checkConnectivity();
|
|
if (connectivityResult == ConnectivityResult.none) return;
|
|
// تأكيد الوصول للإنترنت
|
|
final hasInternet = await InternetConnectionChecker().hasConnection;
|
|
```
|
|
|
|
### 5.3 Socket Optimization
|
|
| الخاصية | Driver Socket | Passenger Socket |
|
|
|----------|---------------|------------------|
|
|
| Transport | WebSocket only | WebSocket only |
|
|
| Auto-connect | Manual (disableAutoConnect) | Manual |
|
|
| Reconnection | Infinite | 20 attempts |
|
|
| Reconnect delay | Default | 2s → max 10s |
|
|
| Connection timeout | Default | 20s |
|
|
|
|
### 5.4 HTTP Optimization
|
|
```
|
|
Upload Retries: 3 محاولات
|
|
Backoff: 2s, 4s, 6s (exponential)
|
|
Timeout: 120 ثانية للرفع
|
|
401 Handling: Auto-refresh JWT + Retry
|
|
```
|
|
|
|
---
|
|
|
|
## 6. تصنيف فئات الأجهزة
|
|
|
|
### 6.1 Device Tier (siro_rider/lib/controller/home/device_tier.dart)
|
|
```
|
|
نظام تسجيل بناءً على:
|
|
- Android SDK version (الأقدم = أعلى نقاط = أضعف)
|
|
- عدد أنوية المعالج
|
|
- عدد ABIs المدعومة
|
|
- هل هو Emulator؟
|
|
|
|
التصنيف:
|
|
- Low: Score ≥ 6
|
|
- Mid: Score ≥ 3
|
|
- High: Score < 3
|
|
- Clobal (يحفظ لمدة 24 ساعة)
|
|
```
|
|
|
|
### 6.2 Device Performance (siro_rider/lib/controller/home/device_performance.dart)
|
|
```
|
|
نظام White-List للأجهزة عالية الأداء:
|
|
- Samsung: S21+ (SM-S), Fold/Flip (SM-F), Note 9+ (SM-N9), S10/S20 (SM-G9)
|
|
- Google: Pixel 6/7/8/9, Pixel Fold
|
|
- Huawei: P40, Mate 20/30/40
|
|
- OnePlus: 7/8/9/10/11, CPH prefix
|
|
- Xiaomi: RAM > 7.5GB
|
|
- Blacklist: MT65xx, MT6735, SC77xx (معالجات رخيصة)
|
|
- iOS: دائماً High-end
|
|
```
|
|
|
|
### 6.3 NearBy Drivers Performance (nearby_drivers_controller.dart)
|
|
```dart
|
|
// كشف الأداء المنخفض:
|
|
lowPerf = (sdk < 28) || (ram > 0 && ram < 3 * 1024 * 1024 * 1024);
|
|
// يخفض زوم الخريطة من 15 إلى 14.5
|
|
```
|
|
|
|
### 6.4 Device Analyzer (siro_driver/lib/controller/functions/device_analyzer.dart)
|
|
```
|
|
نظام تسجيل كامل (100 نقطة كحد أقصى):
|
|
1. Android version (max 10pts)
|
|
2. RAM (max 10pts): 8GB+ = 10, 4GB+ = 5, 3GB+ = 3
|
|
3. CPU cores (max 10pts): 6+ = 10, 4+ = 5
|
|
4. Free storage (max 5pts): 5GB+ = 5, 2GB+ = 3
|
|
5. GPS + Gyroscope (max 10pts)
|
|
6. Storage write speed test (max 20pts) — يكتب 5MB ويقيس السرعة
|
|
7. CPU compute speed test (max 20pts) — 100M floating point iterations
|
|
8. Memory pressure (max 15pts) — /proc/meminfo
|
|
```
|
|
|
|
---
|
|
|
|
## 7. الخدمات الخلفية
|
|
|
|
### 7.1 Android Foreground Service
|
|
```dart
|
|
// الميزات:
|
|
- تشتغل 24/7
|
|
- تحديث الموقع عبر LocationController (وليس من Background Service)
|
|
- لا تحتوي على GPS (قاعدة معمارية)
|
|
- Notification بأقل أولوية (Importance.low)
|
|
- إعادة تشغيل تلقائي عند BOOT_COMPLETED
|
|
- تدعم Picture-in-Picture
|
|
```
|
|
|
|
### 7.2 iOS Background
|
|
```dart
|
|
// iOS: لا يشغل Background Service
|
|
// يعتمد على تحديثات الموقع من iOS system
|
|
// LocationController يستخدم enableBackgroundMode من package
|
|
```
|
|
|
|
### 7.3 Geofencing (Hardware-level)
|
|
```
|
|
يستخدم native_geofence package:
|
|
- Android: GeofencingApi (hardware)
|
|
- iOS: CLRegion (hardware)
|
|
- فعال جداً للبطارية
|
|
- مشغل من الخادم
|
|
```
|
|
|
|
---
|
|
|
|
## 8. نقاط الضعف والتوصيات
|
|
|
|
### 8.1 المشكلات الحالية
|
|
|
|
| # | المشكلة | التأثير | الحل المقترح | الجهد |
|
|
|---|---------|---------|--------------|-------|
|
|
| 1 | **WakeLock دائم** | يستنزف البطارية خارج الرحلات | تشغيل فقط أثناء الرحلة النشطة | 1 يوم |
|
|
| 2 | **GPS accuracy = navigation** | أعلى دقة حتى في توفير الطاقة | استخدام high بدلاً من navigation في توفير الطاقة | 2 ساعة |
|
|
| 3 | **لا تكيف حسب السرعة** | نفس الـ Polling في الحركة والتوقف | إيقاف GPS عند السرعة = 0 (متوقف) | 1 يوم |
|
|
| 4 | **Doze Mode** | لم يتم التعامل مع Android Doze | استخدام FCM لتجاوز Doze | 2 يوم |
|
|
| 5 | **حجم التطبيق كبير** | Flutter + حزم كثيرة | App Bundle، إزالة الحزم غير المستخدمة | مستمر |
|
|
| 6 | **بدء التشغيل بطيء** | WakeLock + Firebase + Location | تأجيل Initialization بعد Splash Screen | 2 يوم |
|
|
| 7 | **Animation Jank** | أحياناً تقطيع في الرسوم المتحركة | استخدام GPU Profiling لاكتشاف المشاكل | مستمر |
|
|
|
|
### 8.2 تحسينات مقترحة — التفاصيل
|
|
|
|
#### 🔧 تحسين 1: Smart WakeLock
|
|
```dart
|
|
// الوضع الحالي:
|
|
// في main.dart:
|
|
await WakelockPlus.enable(); // دائم — مشكلة
|
|
|
|
// الوضع المقترح:
|
|
// في RideLifecycleController:
|
|
void onRideStateChanged(RideState state) {
|
|
switch (state) {
|
|
case RideState.searching:
|
|
case RideState.inProgress:
|
|
case RideState.driverArrived:
|
|
await WakelockPlus.enable(); // فقط أثناء الرحلة
|
|
break;
|
|
case RideState.noRide:
|
|
case RideState.finished:
|
|
case RideState.cancelled:
|
|
await WakelockPlus.disable(); // يسمح للسكون
|
|
break;
|
|
}
|
|
}
|
|
```
|
|
|
|
#### 🔧 تحسين 2: GPS Speed-adaptive
|
|
```dart
|
|
// الوضع المقترح:
|
|
if (speed < 0.5) {
|
|
// متوقف — أوقف GPS بالكامل أو خفف الجهد
|
|
interval = 30000; // 30 ثانية بدلاً من 5
|
|
distanceFilter = 100; // 100 متر بدلاً من 10
|
|
} else if (speed < 10) {
|
|
// حركة بطيئة
|
|
interval = powerSaveMode ? 15000 : 8000;
|
|
distanceFilter = powerSaveMode ? 30 : 15;
|
|
} else {
|
|
// سرعة عادية
|
|
interval = powerSaveMode ? 10000 : 5000;
|
|
distanceFilter = powerSaveMode ? 20 : 10;
|
|
}
|
|
```
|
|
|
|
#### 🔧 تحسين 3: تقليل حجم التطبيق
|
|
```
|
|
الحلول المقترحة:
|
|
1. Android App Bundle (توفير 30-40% حجم)
|
|
2. حذف الحزم غير المستخدمة (flutter_overlay_window للـ Rider — لا يحتاجه)
|
|
3. استخدام Lottie بدلاً من GIF للرسوم المتحركة
|
|
4. Shorebird OTA للتحديثات (مستخدم بالفعل)
|
|
5. حذف assets غير المستخدمة
|
|
6. Flutter DevTools لتحديد الـ Bloat
|
|
```
|
|
|
|
#### 🔧 تحسين 4: Startup Time Optimization
|
|
```dart
|
|
// حلاً مقترحاً لتسريع بدء التشغيل:
|
|
void main() async {
|
|
WidgetsFlutterBinding.ensureInitialized();
|
|
runApp(SpashScreen()); // أولاً: شاشة البداية سريعة
|
|
|
|
// ثم في الخلفية:
|
|
Future.wait([
|
|
initializeFirebase(), // غير ضروري فوراً
|
|
initLocationController(), // غير ضروري فوراً
|
|
WakelockPlus.enable(), // يمكن تأجيله
|
|
loadUserSession(), // ضروري
|
|
]).then((_) => runApp(SiroApp())); // بعد التحميل
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 9. خطة التحسين المقترحة
|
|
|
|
### الأسبوع 1: تحسينات سريعة
|
|
- [ ] Smart WakeLock — تشغيل فقط أثناء الرحلة
|
|
- [ ] GPS accuracy = high في توفير الطاقة (بدلاً من navigation)
|
|
- [ ] تفعيل Android App Bundle
|
|
|
|
### الأسبوع 2: تحسينات متوسطة
|
|
- [ ] GPS Speed-adaptive polling
|
|
- [ ] Doze Mode handling
|
|
- [ ] تأجيل Initialization بعد Splash
|
|
|
|
### الأسبوع 3: تحسينات متقدمة
|
|
- [ ] تحليل الـ Memory Leaks عبر DevTools
|
|
- [ ] تفريغ الخريطة عند عدم ظهورها
|
|
- [ ] حذف الحزم غير المستخدمة
|
|
|
|
### الأسبوع 4: مراقبة واختبار
|
|
- [ ] اختبار استهلاك البطارية على 10 أجهزة مختلفة
|
|
- [ ] قياس FPS والـ Jank
|
|
- [ ] قياس وقت بدء التشغيل
|
|
|
|
---
|
|
|
|
## خاتمة
|
|
|
|
**نظام تحسين البطارية في سيرو متقدم جداً مقارنة بمنافسيه** — نظام GPS المتكيف مع وضع توفير الطاقة التلقائي، و Batch Upload، والمعمارية التي تفصل GPS عن Background Service كلها قرارات تصميمية ممتازة.
|
|
|
|
**نقاط القوة**: Heartbeat الذكي، Distance Filter، Movement-based recording، Geofencing hardware-level
|
|
|
|
**نقاط الضعف**: WakeLock الدائم، GPS accuracy ثابت، عدم التكيف مع السرعة، حجم التطبيق
|
|
|
|
**التقييم العام**: 8/10 مع إمكانية رفع إلى 9.5/10 بعد التحسينات المقترحة
|
|
|
|
> "سيرو لديها أفضل نظام إدارة بطارية رأيناه في منصات النقل بالمنطقة، مع تحسينات بسيطة يمكن أن تصبح الأفضل عالمياً"
|