Skip to content

Commit 17e0fe1

Browse files
authored
Migration for HotEvent for Flutter hot runner (#137717)
Related to tracker issue: - flutter/flutter#128251 For this migration, the `HotEvent` was being referenced in 2 additional files outside of `lib/src/reporting/events.dart`, shown below in the screenshot <img width="257" alt="image" src="https://github.com/flutter/flutter/assets/42216813/97986f89-2253-4db1-9deb-bbced6321a16">
1 parent 925f3ee commit 17e0fe1

16 files changed

+394
-17
lines changed

packages/flutter_tools/lib/src/commands/attach.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import 'dart:async';
66

7+
import 'package:unified_analytics/unified_analytics.dart';
78
import 'package:vm_service/vm_service.dart';
89

910
import '../android/android_device.dart';
@@ -538,6 +539,7 @@ known, it can be explicitly provided to attach via the command-line, e.g.
538539
dillOutputPath: stringArg('output-dill'),
539540
ipv6: usesIpv6,
540541
flutterProject: flutterProject,
542+
analytics: analytics,
541543
)
542544
: ColdRunner(
543545
flutterDevices,
@@ -570,6 +572,7 @@ class HotRunnerFactory {
570572
bool stayResident = true,
571573
bool ipv6 = false,
572574
FlutterProject? flutterProject,
575+
required Analytics analytics,
573576
}) => HotRunner(
574577
devices,
575578
target: target,
@@ -581,5 +584,6 @@ class HotRunnerFactory {
581584
dillOutputPath: dillOutputPath,
582585
stayResident: stayResident,
583586
ipv6: ipv6,
587+
analytics: analytics,
584588
);
585589
}

packages/flutter_tools/lib/src/commands/daemon.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -545,6 +545,7 @@ class AppDomain extends Domain {
545545
urlTunneller: options.webEnableExposeUrl! ? daemon.daemonDomain.exposeUrl : null,
546546
machine: machine,
547547
usage: globals.flutterUsage,
548+
analytics: globals.analytics,
548549
systemClock: globals.systemClock,
549550
logger: globals.logger,
550551
fileSystem: globals.fs,
@@ -561,6 +562,7 @@ class AppDomain extends Domain {
561562
multidexEnabled: multidexEnabled,
562563
hostIsIde: true,
563564
machine: machine,
565+
analytics: globals.analytics,
564566
);
565567
} else {
566568
runner = ColdRunner(

packages/flutter_tools/lib/src/commands/run.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -597,6 +597,7 @@ class RunCommand extends RunCommandBase {
597597
stayResident: stayResident,
598598
ipv6: ipv6 ?? false,
599599
multidexEnabled: boolArg('multidex'),
600+
analytics: globals.analytics,
600601
);
601602
} else if (webMode) {
602603
return webRunnerFactory!.createWebRunner(
@@ -608,6 +609,7 @@ class RunCommand extends RunCommandBase {
608609
stayResident: stayResident,
609610
fileSystem: globals.fs,
610611
usage: globals.flutterUsage,
612+
analytics: globals.analytics,
611613
logger: globals.logger,
612614
systemClock: globals.systemClock,
613615
);

packages/flutter_tools/lib/src/drive/web_driver_service.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ class WebDriverService extends DriverService {
8989
flutterProject: FlutterProject.current(),
9090
fileSystem: globals.fs,
9191
usage: globals.flutterUsage,
92+
analytics: globals.analytics,
9293
logger: _logger,
9394
systemClock: globals.systemClock,
9495
);

packages/flutter_tools/lib/src/isolated/resident_web_runner.dart

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'dart:async';
77
// ignore: import_of_legacy_library_into_null_safe
88
import 'package:dwds/dwds.dart';
99
import 'package:package_config/package_config.dart';
10+
import 'package:unified_analytics/unified_analytics.dart';
1011
import 'package:vm_service/vm_service.dart' as vmservice;
1112
import 'package:webkit_inspection_protocol/webkit_inspection_protocol.dart'
1213
hide StackTrace;
@@ -57,6 +58,7 @@ class DwdsWebRunnerFactory extends WebRunnerFactory {
5758
required FileSystem fileSystem,
5859
required SystemClock systemClock,
5960
required Usage usage,
61+
required Analytics analytics,
6062
bool machine = false,
6163
}) {
6264
return ResidentWebRunner(
@@ -69,6 +71,7 @@ class DwdsWebRunnerFactory extends WebRunnerFactory {
6971
urlTunneller: urlTunneller,
7072
machine: machine,
7173
usage: usage,
74+
analytics: analytics,
7275
systemClock: systemClock,
7376
fileSystem: fileSystem,
7477
logger: logger,
@@ -93,12 +96,14 @@ class ResidentWebRunner extends ResidentRunner {
9396
required Logger logger,
9497
required SystemClock systemClock,
9598
required Usage usage,
99+
required Analytics analytics,
96100
UrlTunneller? urlTunneller,
97101
ResidentDevtoolsHandlerFactory devtoolsHandler = createDefaultHandler,
98102
}) : _fileSystem = fileSystem,
99103
_logger = logger,
100104
_systemClock = systemClock,
101105
_usage = usage,
106+
_analytics = analytics,
102107
_urlTunneller = urlTunneller,
103108
super(
104109
<FlutterDevice>[device],
@@ -114,6 +119,7 @@ class ResidentWebRunner extends ResidentRunner {
114119
final Logger _logger;
115120
final SystemClock _systemClock;
116121
final Usage _usage;
122+
final Analytics _analytics;
117123
final UrlTunneller? _urlTunneller;
118124

119125
@override
@@ -441,15 +447,25 @@ Please provide a valid TCP port (an integer between 0 and 65535, inclusive).
441447
// Don't track restart times for dart2js builds or web-server devices.
442448
if (debuggingOptions.buildInfo.isDebug && deviceIsDebuggable) {
443449
_usage.sendTiming('hot', 'web-incremental-restart', elapsed);
450+
final String sdkName = await device!.device!.sdkNameAndVersion;
444451
HotEvent(
445452
'restart',
446453
targetPlatform: getNameForTargetPlatform(TargetPlatform.web_javascript),
447-
sdkName: await device!.device!.sdkNameAndVersion,
454+
sdkName: sdkName,
448455
emulator: false,
449456
fullRestart: true,
450457
reason: reason,
451458
overallTimeInMs: elapsed.inMilliseconds,
452459
).send();
460+
_analytics.send(Event.hotRunnerInfo(
461+
label: 'restart',
462+
targetPlatform: getNameForTargetPlatform(TargetPlatform.web_javascript),
463+
sdkName: sdkName,
464+
emulator: false,
465+
fullRestart: true,
466+
reason: reason,
467+
overallTimeInMs: elapsed.inMilliseconds
468+
));
453469
}
454470
return OperationResult.ok;
455471
}

packages/flutter_tools/lib/src/run_hot.dart

Lines changed: 102 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'dart:async';
77
import 'package:meta/meta.dart';
88
import 'package:package_config/package_config.dart';
99
import 'package:pool/pool.dart';
10+
import 'package:unified_analytics/unified_analytics.dart';
1011
import 'package:vm_service/vm_service.dart' as vm_service;
1112

1213
import 'base/context.dart';
@@ -94,17 +95,20 @@ class HotRunner extends ResidentRunner {
9495
ReloadSourcesHelper reloadSourcesHelper = defaultReloadSourcesHelper,
9596
ReassembleHelper reassembleHelper = _defaultReassembleHelper,
9697
NativeAssetsBuildRunner? buildRunner,
97-
}) : _stopwatchFactory = stopwatchFactory,
98-
_reloadSourcesHelper = reloadSourcesHelper,
99-
_reassembleHelper = reassembleHelper,
98+
required Analytics analytics,
99+
}) : _stopwatchFactory = stopwatchFactory,
100+
_reloadSourcesHelper = reloadSourcesHelper,
101+
_reassembleHelper = reassembleHelper,
100102
_buildRunner = buildRunner,
101-
super(
103+
_analytics = analytics,
104+
super(
102105
hotMode: true,
103106
);
104107

105108
final StopwatchFactory _stopwatchFactory;
106109
final ReloadSourcesHelper _reloadSourcesHelper;
107110
final ReassembleHelper _reassembleHelper;
111+
final Analytics _analytics;
108112

109113
final bool benchmarkMode;
110114
final File? applicationBinary;
@@ -429,15 +433,29 @@ class HotRunner extends ResidentRunner {
429433
}));
430434
}
431435

432-
unawaited(appStartedCompleter?.future.then((_) => HotEvent('reload-ready',
433-
targetPlatform: _targetPlatform!,
434-
sdkName: _sdkName!,
435-
emulator: _emulator!,
436-
fullRestart: false,
437-
overallTimeInMs: appStartedTimer.elapsed.inMilliseconds,
438-
compileTimeInMs: totalCompileTime.inMilliseconds,
439-
transferTimeInMs: totalLaunchAppTime.inMilliseconds,
440-
).send()));
436+
unawaited(appStartedCompleter?.future.then((_) {
437+
HotEvent(
438+
'reload-ready',
439+
targetPlatform: _targetPlatform!,
440+
sdkName: _sdkName!,
441+
emulator: _emulator!,
442+
fullRestart: false,
443+
overallTimeInMs: appStartedTimer.elapsed.inMilliseconds,
444+
compileTimeInMs: totalCompileTime.inMilliseconds,
445+
transferTimeInMs: totalLaunchAppTime.inMilliseconds,
446+
).send();
447+
448+
_analytics.send(Event.hotRunnerInfo(
449+
label: 'reload-ready',
450+
targetPlatform: _targetPlatform!,
451+
sdkName: _sdkName!,
452+
emulator: _emulator!,
453+
fullRestart: false,
454+
overallTimeInMs: appStartedTimer.elapsed.inMilliseconds,
455+
compileTimeInMs: totalCompileTime.inMilliseconds,
456+
transferTimeInMs: totalLaunchAppTime.inMilliseconds,
457+
));
458+
}));
441459

442460
try {
443461
final List<bool> results = await Future.wait(startupTasks);
@@ -828,6 +846,21 @@ class HotRunner extends ResidentRunner {
828846
findInvalidatedTimeInMs: result.updateFSReport?.findInvalidatedDuration.inMilliseconds,
829847
scannedSourcesCount: result.updateFSReport?.scannedSourcesCount,
830848
).send();
849+
_analytics.send(Event.hotRunnerInfo(
850+
label: 'restart',
851+
targetPlatform: targetPlatform,
852+
sdkName: sdkName,
853+
emulator: emulator,
854+
fullRestart: true,
855+
reason: reason,
856+
overallTimeInMs: restartTimer.elapsed.inMilliseconds,
857+
syncedBytes: result.updateFSReport?.syncedBytes,
858+
invalidatedSourcesCount: result.updateFSReport?.invalidatedSourcesCount,
859+
transferTimeInMs: result.updateFSReport?.transferDuration.inMilliseconds,
860+
compileTimeInMs: result.updateFSReport?.compileDuration.inMilliseconds,
861+
findInvalidatedTimeInMs: result.updateFSReport?.findInvalidatedDuration.inMilliseconds,
862+
scannedSourcesCount: result.updateFSReport?.scannedSourcesCount,
863+
));
831864
}
832865
} on vm_service.SentinelException catch (err, st) {
833866
restartEvent = 'exception';
@@ -846,6 +879,14 @@ class HotRunner extends ResidentRunner {
846879
fullRestart: true,
847880
reason: reason,
848881
).send();
882+
_analytics.send(Event.hotRunnerInfo(
883+
label: restartEvent,
884+
targetPlatform: targetPlatform,
885+
sdkName: sdkName,
886+
emulator: emulator,
887+
fullRestart: true,
888+
reason: reason,
889+
));
849890
}
850891
status?.cancel();
851892
}
@@ -895,6 +936,14 @@ class HotRunner extends ResidentRunner {
895936
fullRestart: false,
896937
reason: reason,
897938
).send();
939+
_analytics.send(Event.hotRunnerInfo(
940+
label: 'reload-barred',
941+
targetPlatform: targetPlatform,
942+
sdkName: sdkName,
943+
emulator: emulator,
944+
fullRestart: false,
945+
reason: reason,
946+
));
898947
} else {
899948
HotEvent('exception',
900949
targetPlatform: targetPlatform!,
@@ -903,6 +952,14 @@ class HotRunner extends ResidentRunner {
903952
fullRestart: false,
904953
reason: reason,
905954
).send();
955+
_analytics.send(Event.hotRunnerInfo(
956+
label: 'exception',
957+
targetPlatform: targetPlatform,
958+
sdkName: sdkName,
959+
emulator: emulator,
960+
fullRestart: false,
961+
reason: reason,
962+
));
906963
}
907964
return OperationResult(errorCode, errorMessage, fatal: true);
908965
} finally {
@@ -965,6 +1022,7 @@ class HotRunner extends ResidentRunner {
9651022
emulator,
9661023
reason,
9671024
globals.flutterUsage,
1025+
globals.analytics,
9681026
);
9691027
if (result.code != 0) {
9701028
return result;
@@ -1024,6 +1082,27 @@ class HotRunner extends ResidentRunner {
10241082
reassembleTimeInMs: reassembleTimer.elapsed.inMilliseconds,
10251083
reloadVMTimeInMs: reloadVMTimer.elapsed.inMilliseconds,
10261084
).send();
1085+
_analytics.send(Event.hotRunnerInfo(
1086+
label: 'reload',
1087+
targetPlatform: targetPlatform,
1088+
sdkName: sdkName,
1089+
emulator: emulator,
1090+
fullRestart: false,
1091+
reason: reason,
1092+
overallTimeInMs: reloadInMs,
1093+
finalLibraryCount: firstReloadDetails['finalLibraryCount'] as int? ?? 0,
1094+
syncedLibraryCount: firstReloadDetails['receivedLibraryCount'] as int? ?? 0,
1095+
syncedClassesCount: firstReloadDetails['receivedClassesCount'] as int? ?? 0,
1096+
syncedProceduresCount: firstReloadDetails['receivedProceduresCount'] as int? ?? 0,
1097+
syncedBytes: updatedDevFS.syncedBytes,
1098+
invalidatedSourcesCount: updatedDevFS.invalidatedSourcesCount,
1099+
transferTimeInMs: updatedDevFS.transferDuration.inMilliseconds,
1100+
compileTimeInMs: updatedDevFS.compileDuration.inMilliseconds,
1101+
findInvalidatedTimeInMs: updatedDevFS.findInvalidatedDuration.inMilliseconds,
1102+
scannedSourcesCount: updatedDevFS.scannedSourcesCount,
1103+
reassembleTimeInMs: reassembleTimer.elapsed.inMilliseconds,
1104+
reloadVMTimeInMs: reloadVMTimer.elapsed.inMilliseconds,
1105+
));
10271106

10281107
if (shouldReportReloadTime) {
10291108
globals.printTrace('Hot reload performed in ${getElapsedAsMilliseconds(reloadDuration)}.');
@@ -1186,6 +1265,7 @@ typedef ReloadSourcesHelper = Future<OperationResult> Function(
11861265
bool? emulator,
11871266
String? reason,
11881267
Usage usage,
1268+
Analytics analytics,
11891269
);
11901270

11911271
@visibleForTesting
@@ -1199,6 +1279,7 @@ Future<OperationResult> defaultReloadSourcesHelper(
11991279
bool? emulator,
12001280
String? reason,
12011281
Usage usage,
1282+
Analytics analytics,
12021283
) async {
12031284
final Stopwatch vmReloadTimer = Stopwatch()..start();
12041285
const String entryPath = 'main.dart.incremental.dill';
@@ -1239,6 +1320,14 @@ Future<OperationResult> defaultReloadSourcesHelper(
12391320
reason: reason,
12401321
usage: usage,
12411322
).send();
1323+
analytics.send(Event.hotRunnerInfo(
1324+
label: 'reload-reject',
1325+
targetPlatform: targetPlatform,
1326+
sdkName: sdkName,
1327+
emulator: emulator,
1328+
fullRestart: false,
1329+
reason: reason,
1330+
));
12421331
// Reset devFS lastCompileTime to ensure the file will still be marked
12431332
// as dirty on subsequent reloads.
12441333
_resetDevFSCompileTime(flutterDevices);

packages/flutter_tools/lib/src/runner/flutter_command.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'package:args/command_runner.dart';
77
import 'package:file/file.dart';
88
import 'package:meta/meta.dart';
99
import 'package:package_config/package_config_types.dart';
10+
import 'package:unified_analytics/unified_analytics.dart';
1011

1112
import '../application_package.dart';
1213
import '../base/common.dart';
@@ -223,6 +224,11 @@ abstract class FlutterCommand extends Command<void> {
223224
bool _excludeDebug = false;
224225
bool _excludeRelease = false;
225226

227+
/// Grabs the [Analytics] instance from the global context. It is defined
228+
/// at the [FlutterCommand] level to enable any classes that extend it to
229+
/// easily reference it or overwrite as necessary.
230+
Analytics get analytics => globals.analytics;
231+
226232
void requiresPubspecYaml() {
227233
_requiresPubspecYaml = true;
228234
}

packages/flutter_tools/lib/src/web/web_runner.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// Use of this source code is governed by a BSD-style license that can be
33
// found in the LICENSE file.
44

5+
import 'package:unified_analytics/unified_analytics.dart';
6+
57
import '../base/context.dart';
68
import '../base/file_system.dart';
79
import '../base/logger.dart';
@@ -31,6 +33,7 @@ abstract class WebRunnerFactory {
3133
required FileSystem fileSystem,
3234
required SystemClock systemClock,
3335
required Usage usage,
36+
required Analytics analytics,
3437
bool machine = false,
3538
});
3639
}

0 commit comments

Comments
 (0)