May 25th, 2025
Este es el cuarto y último artículo del blog en la serie
Flutter – Detección de fugas de memoria
. Si aún no lo has hecho, te sugiero encarecidamente que comiences con el
.
El 1 de septiembre de 2022, Polina Cherkasova realizó el primer commit en su nuevo proyecto Dart-lang llamado
. Este miembro clave del equipo de Flutter recibió la tarea de crear una herramienta que ayudaría a detectar objetos no eliminados y no recolectados por el recolector de basura.
El plan para esta herramienta es que se incluya en Dart DevTools una vez completada, pero en el momento de escribir este artículo, aún no ha sido lanzada oficialmente (mis versiones activas:
Flutter 3.27.1
,
Dart 3.6.0
,
DevTools 2.40.2
). Como la documentación es casi inexistente, tuve que revisar el código fuente para entender cómo funciona y cómo alguien puede usarlo.
El objetivo de este artículo es enseñarte cómo puedes utilizarlo.
La idea del equipo de Dart detrás de este paquete es simple. El paquete ayuda a identificar y diagnosticar fugas de memoria en aplicaciones Dart.
Características clave:
Al leer el código, he identificado varios lugares donde noté que los métodos de Leak Tracker se llamaban durante la creación de objetos que no se eliminan por sí mismos. Si Leak Tracker se instancia, hará lo siguiente:
Ejemplo de código SDK Flutter - Seguimiento de la creación del objeto ImageInfo
Ejemplo de código SDK Flutter - Seguimiento de la creación del objeto TrainHoppingAnimation
Ejemplo de código SDK Flutter - Seguimiento de la creación del objeto TextSelectionOverlay
¿Cómo puedes usar Dart Leak Tracker antes del lanzamiento oficial? La documentación para la configuración en el repositorio oficial de GitHub está desactualizada y ya no funciona. Al corregir un error en Dart Leak Tracker (
aún no ha sido fusionada), juntando algunos fragmentos de código de un post de Reddit de hace dos años y algunos problemas de GitHub, logré hacer que funcionara.
Para usar Dart Leak Tracker dentro de tu aplicación Flutter, primero debes corregir el error en el código de Dart Leak Tracker. Navega hasta donde está instalado tu paquete dart-lang en tu máquina y abre el archivo
pkgs/leak_tracker/lib/src/leak_tracking/_object_tracker.dart
. Necesitas corregir el filtro que filtra las fugas que se recolectan tarde por el recolector de basura.
LeakType.gcedLate: _objects.gcedLateLeaks
// .where((record) => _leakFilter.shouldReport(LeakType.notGCed, record)) fixed
.where((record) => _leakFilter.shouldReport(LeakType.gcedLate, record))
.map((record) => record.toLeakReport())
.toList(),
});
A continuación, si estás utilizando mi código del artículo anterior de la serie, reemplaza el contenido del archivo
main.dart
con el contenido encontrado
. Si estás buscando fugas en tu aplicación, asegúrate de agregar lo siguiente a tu archivo
main.dart
(omite estos pasos si estás utilizando mi código):
Necesitas importar las dependencias requeridas, y antes de que se llame a runApp, debes instanciar el paquete 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());
}
Necesitas implementar un mecanismo que recolecte las fugas actualmente observadas y te las devuelva. En mi aplicación de demostración, he modificado la devolución de llamada onPressed del
TextButton
para que también recolecte las fugas.
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");
},
Ejecuta la aplicación, realiza acciones que normalmente producen fugas de memoria y luego intenta recolectarlas. La forma más rápida de observar lo que se ha recolectado es colocar un punto de interrupción y verificar qué se asignó a la variable
leaks
.
Ten en cuenta que el paquete
leak_tracker
aún no ha sido lanzado, y al igual que con la herramienta Memory view, es posible que no haya encontrado al culpable de tus fugas.
¿Por qué no encontró leak_tracker tus fugas?
Ahora viene la parte difícil. Lo único que queda es producir y analizar el volcado de memoria de tu aplicación. El análisis del volcado de memoria está fuera del alcance de esta serie de artículos del blog, pero estaré encantado de
contigo.