chore: استيراد أولي من سيرو (ecfe7568) — بلا أي تعديل
نسخة كاملة من مستودع سيرو عند ecfe7568 لتكون أساس تطبيق «انطلق». نُسخ المتعقَّب في git فقط (12,509 ملفاً / 302 م.ب) بـ git archive، لا `cp -r` — فاستُثنيت تلقائياً مخلفات البناء (build · node_modules · .dart_tool · .gradle · Pods ≈ 10.7 غ.ب) وكل ما يستثنيه .gitignore. هذا الكوميت **بلا أي تعديل عمداً** حتى يكون كل ما يليه فرقاً مقروءاً مقابل سيرو الأصلي. سيرو نفسه لم يُمسّ. ⚠️ لا يبني بعد: `.env` و`lib/env/env.g.dart` غير متعقَّبين في سيرو (وهذا صحيح — أسرار لكل مستأجر). كل تطبيق فلاتر هنا يحتاج .env خاصاً بانطلق ثم توليد env.g.dart عبر build_runner. لا تُنسخ أسرار سيرو. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,420 @@
|
||||
# تحليل استهلاك البطارية وأداء التطبيق — سيرو
|
||||
## 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 بعد التحسينات المقترحة
|
||||
|
||||
> "سيرو لديها أفضل نظام إدارة بطارية رأيناه في منصات النقل بالمنطقة، مع تحسينات بسيطة يمكن أن تصبح الأفضل عالمياً"
|
||||
Reference in New Issue
Block a user