- Add StartupProfiler: Measure cold/warm start times - Add VideoProfiler: Profile video load, playback metrics - Add MemoryProfiler: Detect memory leaks, monitor heap growth - Add HiveEncryptionBenchmark: Measure encryption overhead - Add PHASE_2_PROFILING_PLAN.md: Complete testing procedures Ready for profiling execution once Flutter SDK is initialized
19 KiB
đ Guide Complet: Conversion XtremFlow pour Android Uniquement
Vue d'ensemble
Ce guide dĂ©taille TOUTES les dĂ©pendances, configurations, et fichiers de code spĂ©cifiques Ă iOS et Web qui doivent ĂȘtre supprimĂ©s ou modifiĂ©s pour maintenir SEULEMENT la plateforme Android.
đ ANALYSE COMPLĂTE DES DĂPENDANCES
1. DĂ©pendances dans pubspec.yaml - DĂTAIL EXHAUSTIF
A. Dépendances Multi-plateforme (GARDER)
# â
GARDER - Fonctionnent sur Android
flutter_riverpod: ^2.6.1 # State Management
riverpod_annotation: ^2.6.1 # Code generation
hive: ^2.2.3 # Local Database
hive_flutter: ^1.1.0 # Flutter Hive integration
dio: ^5.7.0 # HTTP client
dio_cache_interceptor: ^3.5.1 # HTTP caching
dio_cache_interceptor_hive_store: ^3.2.2 # Cache storage
http: ^1.2.2 # HTTP client
go_router: ^13.2.5 # Navigation
google_fonts: ^6.2.1 # Typography
cached_network_image: ^3.3.1 # Image caching
crypto: ^3.0.3 # Encryption
uuid: ^4.4.0 # UUID generation
intl: ^0.19.0 # Internationalization
equatable: ^2.0.5 # Value equality
shared_preferences: ^2.3.2 # Local storage
path_provider: ^2.1.5 # File system paths
B. Dépendances Spécifiques au Web (à SUPPRIMER)
# â SUPPRIMER
universal_html: ^2.3.0 # Web HTML compatibility layer
pointer_interceptor: ^0.10.1 # Web pointer handling (optional)
Pourquoi?
universal_htmlest utilisé UNIQUEMENT pour accéder au DOM webpointer_interceptorest principalement pour web/desktop
C. Dépendances Audio/Vidéo
# â
GARDER - Media Kit (disponible sur Android via NDK)
media_kit: ^1.1.11
media_kit_video: ^1.2.5
media_kit_libs_video: ^1.0.5
Note: media_kit fonctionne sur Android, iOS et Web. Les libs vidéo sont compilées natif pour Android.
# â
GARDER - Video Player (fallback Android native)
video_player: ^2.10.1
D. Dépendances SystÚme
# â
GARDER - Utiles pour Android
wakelock_plus: ^1.2.8 # Keep screen on during playback
E. Dev Dependencies (Ă ADAPTER)
dev_dependencies:
flutter_launcher_icons: ^0.14.3 # â REMPLACER LA CONFIG (voir ci-dessous)
2. Configuration Flutter dans pubspec.yaml
Configuration d'IcĂŽnes (Ă MODIFIER)
# â AVANT (supporte iOS)
flutter_launcher_icons:
android: true
ios: false # DĂ©jĂ dĂ©sactivĂ© â
image_path: "web/icons/Icon-512.png"
adaptive_icon_background: "#1a1a2e"
adaptive_icon_foreground: "web/icons/Icon-512.png"
# â
APRĂS (Android uniquement)
flutter_launcher_icons:
android: true
image_path: "assets/images/icon.png" # Utiliser images locales
adaptive_icon_background: "#1a1a2e"
adaptive_icon_foreground: "assets/images/icon_foreground.png"
Assets Ă GARDER
flutter:
uses-material-design: true
assets:
- assets/images/
đïž FICHIERS ET DOSSIERS Ă SUPPRIMER
1. Dossier iOS Complet â
/ios/
âââ Flutter/ # â Supprimer
âââ Runner/ # â Supprimer
âââ Runner.xcodeproj/ # â Supprimer
âââ Runner.xcworkspace/ # â Supprimer
âââ RunnerTests/ # â Supprimer
Taille approximative: ~500MB build artifacts + source
2. Dossier Web Complet â
/web/
âââ index.html # â Supprimer
âââ player.html # â Supprimer
âââ manifest.json # â Supprimer
âââ favicon.png # â Supprimer
âââ icons/ # â Supprimer
âââ Icon-192.png
âââ Icon-512.png
âââ ...
3. Fichiers de Configuration Web
â Supprimer dans la racine:
- web/ # Dossier entier
đ FICHIERS DART Ă MODIFIER
1. Fichiers Ă Supprimer ComplĂštement
/lib/core/shims/ - Abstractions Web
â Supprimer entiĂšrement:
/lib/core/shims/
âââ ui_web.dart # Export conditionnel pour web
âââ ui_web_real.dart # impl web (dart:ui_web)
âââ ui_web_fake.dart # impl fake
Raison: Ces shims n'ont de sens que pour web
/lib/core/utils/platform_utils_web.dart
// â Ă SUPPRIMER
import 'dart:html' as html;
bool isHttps() {
return html.window.location.protocol == 'https:';
}
String getWindowOrigin() {
return html.window.location.origin;
}
/lib/core/utils/platform_utils_stub.dart
â Supprimer (classe stub pour web)
2. Fichiers Ă Modifier - Supprimer imports Web
A. /lib/features/iptv/screens/player_screen.dart
// â Ă SUPPRIMER - Lignes 3-4
import 'package:universal_html/html.dart' as html;
import '../../../core/shims/ui_web.dart' as ui_web;
// â Ă SUPPRIMER - Ligne 18 (import util)
import '../../../core/utils/platform_utils_web.dart';
// â Ă SUPPRIMER - MĂ©thode (ligne ~50)
void _setupMessageListener() {
// Listen for postMessage from player.html iframe
_messageSubscription = html.window.onMessage.listen((event) {
try {
final data = event.data;
if (data is Map) {
// ... tout le code ici
}
}
});
}
// â Ă SUPPRIMER - Code web (ligne ~458)
ui_web.platformViewRegistry.registerViewFactory(
_viewId,
(int viewId) => IframeElement()..src = 'player.html?vid=$_viewId',
);
Action: Supprimer cette classe COMPLĂTEMENT et utiliser native_player_screen.dart uniquement
- Elle est pour web seulement
- Android utilise
lib/mobile/features/iptv/screens/native_player_screen.dart
B. /lib/features/iptv/widgets/settings_tab.dart
// â Ă SUPPRIMER - Ligne 5
import 'package:universal_html/html.dart' as html; // For reloading
// â Ă SUPPRIMER - MĂ©thode (chercher "html.location.reload")
void _clearBrowserStorage() {
// Clear Browser Local Storage (SharedPreferences backend for Web)
html.window.localStorage.clear();
html.location.reload();
}
Alternative Android:
// â
REMPLACER par:
void _clearBrowserStorage() {
// Clear local storage (SharedPreferences)
ref.read(settingsProvider.notifier).clearCache();
// Pas de reload sur Android
}
C. /lib/core/database/hive_service.dart
// â Ă MODIFIER - Supprimer les commentaires et logique web
/// Initialize Hive for Web with encryption
// Remplacer par:
/// Initialize Hive with encryption
// â Ă SUPPRIMER - Bloc de commentaires:
// Initialize Hive for Web (uses IndexedDB)
// Note: On Web, IndexedDB is already isolated by origin,
// â Ă SUPPRIMER - Logique web:
// Open boxes WITHOUT encryption on Web
// For web: use session-based key (regenerated each session)
Raison: Les commentaires spécifiques au web ne s'appliquent pas
3. Fichiers Ă GARDER (mais vĂ©rifier) â
/lib/core/api/dns_interceptor.dart
import 'dart:io'; // â
OK pour Android
// Tout le code est compatible Android
/lib/core/api/dns_resolver.dart
import 'dart:io'; // â
OK pour Android
import 'package:http/http.dart' as http; // â
OK
// Tout le code est compatible Android
4. Fichiers de Points d'Entrée (main.dart)
Option A: Garder main_mobile.dart comme point d'entrée unique
// â
GARDER - c'est la version Android optimisée
/lib/main_mobile.dart
// â SUPPRIMER - version web/gĂ©nĂ©rique
/lib/main.dart
Raison: main_mobile.dart est spécifiquement optimisé pour Android:
- Initialise
MediaKit(obligatoire pour vidéo) - Efface le cache au démarrage
- Utilise
MobilePlaylistScreendirectement - Pas de routeur web
Ătapes:
- Renommer
main_mobile.dartâmain.dart - Supprimer l'ancien
main.dart - Vérifier les imports dans le nouveau
main.dart
5. Architecture Générale des Dossiers
Ă GARDER â
/lib/
âââ main.dart # Anciennement main_mobile.dart
âââ mobile/ # â
Dossier entier pour Android
â âââ features/
â â âââ iptv/
â â âââ screens/
â â â âââ native_player_screen.dart # â
PRINCIPAL
â â â âââ lite_player_screen.dart # â
FALLBACK
â â â âââ mobile_dashboard_screen.dart
â â â âââ mobile_playlist_selection_screen.dart
â â â âââ mobile_series_detail_screen.dart
â â âââ widgets/
â â âââ mobile_live_tv_tab.dart
â â âââ mobile_movies_tab.dart
â â âââ ...
â âââ providers/
â â âââ mobile_xtream_providers.dart
â â âââ mobile_settings_providers.dart
â âââ theme/
â â âââ mobile_theme.dart
â âââ widgets/
â âââ tv_focusable.dart
âââ core/ # â
Partagé (nettoyer les refs web)
â âââ api/
â â âââ dns_interceptor.dart
â â âââ dns_resolver.dart
â â âââ api_client.dart
â â âââ ...
â âââ database/
â âââ models/
â âââ providers/
â âââ router/
â âââ services/
â âââ theme/
â âââ utils/
â âââ widgets/
â âââ (ex. shims/removed)
âââ features/ â â ANALYSER (voir ci-dessous)
Ă ANALYSER đ /lib/features/
/lib/features/
âââ auth/ # ?
âââ iptv/ # ? (PROBLĂME)
â âââ screens/
â â âââ player_screen.dart # â WEB-ONLY, SUPPRIMER
â âââ widgets/
â â âââ settings_tab.dart # â ïž Ă NETTOYER (web imports)
â âââ ...
âââ admin/ (si nĂ©cessaire)
PROBLĂME CRITIQUE: /lib/features/ contient du code WEB
player_screen.dart- Utiliseuniversal_html, iframes,player.htmlsettings_tab.dart- AccĂšs au localStorage viahtml.window
Solution:
- Supprimer ou remplacer ces fichiers par les équivalents mobiles
- Ou rediriger vers
mobile/features/équivalent
đŻ MODIFICATIONS CRITIQUES PAR FICHIER
1. pubspec.yaml - Ă MODIFIER
# AVANT
dependencies:
universal_html: ^2.3.0 # â SUPPRIMER
pointer_interceptor: ^0.10.1 # â SUPPRIMER (optional)
# ... reste OK
flutter_launcher_icons:
android: true
ios: false
image_path: "web/icons/Icon-512.png" # â ïž CHANGER
adaptive_icon_foreground: "web/icons/Icon-512.png" # â ïž CHANGER
# APRĂS
dependencies:
# â
Supprimer universal_html
# â
Supprimer pointer_interceptor
# Reste identique
flutter_launcher_icons:
android: true
image_path: "assets/images/icon.png"
adaptive_icon_foreground: "assets/images/icon_fg.png"
2. android/app/build.gradle.kts - Ă VĂRIFIER â
// â
GARDER TOUS CES PARAMĂTRES
android {
namespace = "com.xtremflow.mobile"
compileSdk = flutter.compileSdkVersion
ndkVersion = flutter.ndkVersion
defaultConfig {
applicationId = "com.xtremflow.mobile"
minSdk = flutter.minSdkVersion
targetSdk = flutter.targetSdkVersion
versionCode = flutter.versionCode
versionName = flutter.versionName
}
}
Aucune modification nécessaire
3. android/app/src/main/AndroidManifest.xml - Ă VĂRIFIER â
<!-- â
GARDER - Permissions essentielles -->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- â
GARDER - Configuration Activity -->
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
Aucune modification nécessaire
â ïž PROBLĂMES ET SOLUTIONS IDENTIFIĂS
ProblĂšme 1: Architecture Duale (Web + Mobile)
Ătat actuel:
/lib/main.dart- Version web/générique/lib/main_mobile.dart- Version Android optimisée/lib/features/iptv/screens/player_screen.dart- CODE WEB/lib/mobile/features/iptv/screens/native_player_screen.dart- CODE ANDROID
Solution:
1. Supprimer /lib/main.dart
2. Renommer main_mobile.dart â main.dart
3. Supprimer /lib/features/iptv/screens/player_screen.dart
4. Vérifier que toutes les routes pointent vers mobile/
5. Supprimer /lib/features/iptv/widgets/settings_tab.dart (web)
ProblÚme 2: Dépendances Web Hardcoded
Fichiers affectés:
player_screen.dartâimport 'package:universal_html/html.dart' as htmlsettings_tab.dartâimport 'package:universal_html/html.dart' as htmlhive_service.dartâ Commentaires web spĂ©cifiques
Solution: Supprimer tous les imports et code web
ProblĂšme 3: Shims de Plateforme
Fichiers:
/lib/core/shims/ui_web.dart/lib/core/shims/ui_web_real.dart/lib/core/shims/ui_web_fake.dart
ProblÚme: Ces shims sont spécifiquement pour web
Solution: Supprimer complĂštement
- Aucune autre partie du code ne les utilise (sauf player_screen.dart qui sera supprimé)
ProblÚme 4: Points d'Entrée de Routeur
Vérifié:
// /lib/core/router/app_router.dart
// â
Utilise routes mobiles ET web
// Solution:
// - Garder SEULEMENT les routes mobiles
// - Supprimer les imports et références à features/iptv/screens/
đ PLAN D'EXĂCUTION DĂTAILLĂ
PHASE 1: Suppression de Fichiers (Bas Risque)
1. Supprimer /ios/ [~500MB]
2. Supprimer /web/ [~2MB]
3. Supprimer /lib/core/shims/ [3 fichiers]
4. Supprimer /lib/core/utils/platform_utils_web.dart
5. Supprimer /lib/core/utils/platform_utils_stub.dart
6. Supprimer /lib/features/iptv/screens/player_screen.dart
7. Supprimer ou remplacer /lib/features/iptv/ au complet
PHASE 2: Modification pubspec.yaml (Bas Risque)
1. Supprimer universal_html: ^2.3.0
2. Supprimer pointer_interceptor: ^0.10.1 (optional)
3. Mettre Ă jour flutter_launcher_icons config
4. flutter pub get
PHASE 3: Refactoring du Dart (Moyen Risque)
1. Supprimer imports web de:
- /lib/features/iptv/widgets/settings_tab.dart
- /lib/features/iptv/screens/* (si non supprimé)
2. Nettoyer /lib/core/database/hive_service.dart:
- Commentaires web spécifiques
- Logique conditionnelle web
3. Renommer main_mobile.dart â main.dart
4. Vérifier /lib/core/router/app_router.dart:
- Routes uniquement mobiles
- Pas de références à features/iptv/screens/player_screen
PHASE 4: Test et Validation (Haut Risque)
1. flutter clean
2. flutter pub get
3. flutter run -d android
4. Tester IPTV playback sur device Android
5. Vérifier persistence données
đ CHECKLIST COMPLĂTE
Fichiers iOS Ă Supprimer (Obligatoire)
/ios/(répertoire entier)
Fichiers Web Ă Supprimer (Obligatoire)
/web/(répertoire entier)
Fichiers Dart Ă Supprimer (Obligatoire)
/lib/core/shims/ui_web.dart/lib/core/shims/ui_web_real.dart/lib/core/shims/ui_web_fake.dart/lib/core/utils/platform_utils_web.dart/lib/core/utils/platform_utils_stub.dart/lib/features/iptv/screens/player_screen.dart
Fichiers Dart Ă Modifier (Obligatoire)
/lib/features/iptv/widgets/settings_tab.dart- Supprimer imports web/lib/core/database/hive_service.dart- Nettoyer commentaires/lib/main_mobile.dart- Renommer en main.dart et supprimer l'ancien/lib/core/router/app_router.dart- Vérifier routes
Modifications Configuration (Obligatoire)
pubspec.yaml:- Supprimer
universal_html - Supprimer
pointer_interceptor - Mettre Ă jour
flutter_launcher_iconsconfig
- Supprimer
flutter pub getflutter clean
Fichiers à Vérifier (Validation)
- Android Manifest - Aucun changement requis
- Android build.gradle - Aucun changement requis
/lib/core/api/- Contient code compatible/lib/mobile/- Dossier entier OK
đŸ DĂPENDANCES FINALES (Android Only)
Production
dependencies:
flutter:
sdk: flutter
# State Management
flutter_riverpod: ^2.6.1
riverpod_annotation: ^2.6.1
# Database
hive: ^2.2.3
hive_flutter: ^1.1.0
# HTTP
dio: ^5.7.0
dio_cache_interceptor: ^3.5.1
dio_cache_interceptor_hive_store: ^3.2.2
http: ^1.2.2
# Routing
go_router: ^13.2.5
# Video (FFmpeg-based)
media_kit: ^1.1.11
media_kit_video: ^1.2.5
media_kit_libs_video: ^1.0.5
# UI
google_fonts: ^6.2.1
cached_network_image: ^3.3.1
# Security
crypto: ^3.0.3
uuid: ^4.4.0
# Utilities
intl: ^0.19.0
equatable: ^2.0.5
shared_preferences: ^2.3.2
path_provider: ^2.1.5
video_player: ^2.10.1
wakelock_plus: ^1.2.8
Dev Dependencies
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^3.0.2
flutter_launcher_icons: ^0.14.3
# Code Generation
build_runner: ^2.4.13
riverpod_generator: ^2.4.0
hive_generator: ^2.0.1
Total à supprimer: 2 dépendances (universal_html, pointer_interceptor)
đ RĂSUMĂ FINAL
| CatĂ©gorie | ĂlĂ©ment | Action | Taille | PrioritĂ© |
|---|---|---|---|---|
| Dossiers Entiers | /ios/ |
Supprimer | ~500MB | đŽ CRITIQUE |
| Dossiers Entiers | /web/ |
Supprimer | ~2MB | đŽ CRITIQUE |
| Shims | ui_web* |
Supprimer | 3 fichiers | đŽ CRITIQUE |
| Code | player_screen.dart |
Supprimer | ~500 lignes | đŽ CRITIQUE |
| Code | settings_tab.dart (web) |
Nettoyer imports | ~850 lignes | đĄ IMPORTANT |
| Code | main.dart |
Supprimer (non-mobile) | ~30 lignes | đŽ CRITIQUE |
| Config | pubspec.yaml |
2 dĂ©pendances | ~2 lignes | đŽ CRITIQUE |
| Config | flutter_launcher_icons |
Adapter | ~3 lignes | đĄ IMPORTANT |
Temps estimĂ©: 30-45 minutes (test inclus) Risque: Bas-Moyen (dĂ©pendances dĂ©jĂ sĂ©parables) Ăconomies: ~500MB disque, dĂ©pendances de build rĂ©duites
đ Fichiers ClĂ©s Ă RĂ©fĂ©rencer AprĂšs Cleanup
â Nouveau point d'entrĂ©e:
/lib/main.dart(anciennement main_mobile.dart)
â UI Mobile (garder):
/lib/mobile/features/iptv/screens/native_player_screen.dart/lib/mobile/features/iptv/screens/lite_player_screen.dart
â Core partagĂ© (nettoyer):
/lib/core/api/(compatible)/lib/core/database/hive_service.dart(nettoyer commentaires)/lib/core/router/app_router.dart(vérifier routes)
â Ă COMPLĂTEMENT OUBLIER:
- Tout sous
/ios/ - Tout sous
/web/ - Tout au-dessus concernant
universal_html,dart:html, ou player.html