May 25th, 2025
Ceci est le quatrième et dernier article de blog de la série
Flutter – Détection des fuites de mémoire
. Si vous ne l’avez pas encore fait, je vous suggère vivement de commencer par le
.
Le 1er septembre 2022, Polina Cherkasova a effectué le premier commit sur son nouveau projet Dart-lang appelé
. Ce membre clé de l’équipe Flutter a reçu la tâche de créer un outil qui aiderait à détecter les objets non supprimés et non collectés par le ramasse-miettes.
Le plan pour cet outil est d’être inclus dans les Dart DevTools une fois terminé, mais au moment de rédiger cet article, il n’a toujours pas été officiellement publié (mes versions actives :
Flutter 3.27.1
,
Dart 3.6.0
,
DevTools 2.40.2
). Comme la documentation est presque inexistante, j’ai dû fouiller dans le code source pour comprendre son fonctionnement et comment quelqu’un peut l’utiliser.
L’objectif de cet article est de vous apprendre comment vous pouvez l’utiliser.
L’idée de l’équipe Dart derrière ce package est simple. Le package aide à identifier et diagnostiquer les fuites de mémoire dans les applications Dart.
Caractéristiques principales :
En lisant le code, j’ai identifié plusieurs endroits où j’ai remarqué que les méthodes de Leak Tracker étaient appelées lors de la création d’objets ne se supprimant pas eux-mêmes. Si Leak Tracker est instancié, il va :
Exemple de code SDK Flutter - Suivi de la création de l'objet ImageInfo
Exemple de code SDK Flutter - Suivi de la création de l'objet TrainHoppingAnimation
Exemple de code SDK Flutter - Suivi de la création de l'objet TextSelectionOverlay
Comment pouvez-vous utiliser Dart Leak Tracker avant la sortie officielle ? La documentation pour la configuration sur le dépôt GitHub officiel est obsolète et ne fonctionne plus. En corrigeant un bug dans Dart Leak Tracker (
n’a pas encore été fusionnée), en rassemblant quelques extraits de code provenant d’un post Reddit vieux de deux ans et de quelques problèmes GitHub, j’ai réussi à le faire fonctionner.
Pour utiliser Dart Leak Tracker dans votre application Flutter, vous devez d’abord corriger le bug dans le code de Dart Leak Tracker. Naviguez jusqu’à l’endroit où votre package dart-lang est installé sur votre machine et ouvrez le fichier
pkgs/leak_tracker/lib/src/leak_tracking/_object_tracker.dart
. Vous devez corriger le filtre qui filtre les fuites collectées tardivement par le ramasse-miettes.
LeakType.gcedLate: _objects.gcedLateLeaks
// .where((record) => _leakFilter.shouldReport(LeakType.notGCed, record)) fixed
.where((record) => _leakFilter.shouldReport(LeakType.gcedLate, record))
.map((record) => record.toLeakReport())
.toList(),
});
Ensuite, si vous utilisez mon code du précédent article de blog de la série, remplacez le contenu du fichier
main.dart
par le contenu trouvé
. Si vous cherchez des fuites dans votre application, assurez-vous d’ajouter ce qui suit à votre fichier
main.dart
(passez ces étapes si vous utilisez mon code) :
Vous devez importer les dépendances requises, et avant que runApp ne soit appelé, vous devez instancier le package Leak Tracking.
import 'package:flutter/foundation.dart';
import "package:leak_tracker/leak_tracker.dart";
void main() {
LeakTracking.start();
FlutterMemoryAllocations.instance.addListener((ObjectEvent event) {
LeakTracking.dispatchObjectEvent(event.toMap());
});
runApp(const MyApp());
}
Vous devez implémenter un mécanisme qui collectera les fuites actuellement observées et vous les renverra. Dans mon application de démonstration, j’ai modifié le callback onPressed du
TextButton
pour qu’il collecte également les fuites.
onPressed: () async {
Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => const HomePage()));
await Future.delayed(const Duration(milliseconds: 500)); // let the leak_tracker settle
Leaks leaks = await LeakTracking.collectLeaks();
print("Leaks collected");
},
Exécutez l’application, faites des choses qui produisent généralement des fuites de mémoire, puis essayez de les collecter. La manière la plus rapide d’observer ce qui a été collecté est de placer un point d’arrêt et de vérifier ce qui a été assigné à la variable
leaks
.
Gardez à l’esprit que le package
leak_tracker
n’a pas encore été publié, et tout comme l’outil Memory view, il est possible qu’il n’ait pas trouvé le coupable de vos fuites.
Pourquoi leak_tracker n’a-t-il pas trouvé vos fuites ?
Maintenant vient la partie difficile. La seule chose qui reste est de produire et d’analyser le dump de mémoire de votre application. L’analyse du dump de mémoire est hors du cadre de cette série d’articles de blog, mais je serai ravi d’en
avec vous.