Skip to content

Commit 8077bb5

Browse files
biggs0125natebiggs
authored andcommitted
Add analytics events for wasm dry runs on web builds (flutter#171818)
Follow up to flutter#171682 Depends on dart-lang/tools#2125 --------- Co-authored-by: Nate Biggs <[email protected]>
1 parent 7119d0c commit 8077bb5

File tree

6 files changed

+69
-23
lines changed

6 files changed

+69
-23
lines changed

packages/flutter_tools/lib/src/build_system/build_targets.dart

Lines changed: 12 additions & 3 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/file_system.dart';
68
import '../web/compiler_config.dart';
79
import './build_system.dart';
@@ -14,7 +16,11 @@ abstract class BuildTargets {
1416
Target get releaseCopyFlutterBundle;
1517
Target get generateLocalizationsTarget;
1618
Target get dartPluginRegistrantTarget;
17-
Target webServiceWorker(FileSystem fileSystem, List<WebCompilerConfig> compileConfigs);
19+
Target webServiceWorker(
20+
FileSystem fileSystem,
21+
List<WebCompilerConfig> compileConfigs,
22+
Analytics analytics,
23+
);
1824
}
1925

2026
/// BuildTargets that return NoOpTarget for every action.
@@ -34,8 +40,11 @@ class NoOpBuildTargets extends BuildTargets {
3440
Target get dartPluginRegistrantTarget => const _NoOpTarget();
3541

3642
@override
37-
Target webServiceWorker(FileSystem fileSystem, List<WebCompilerConfig> compileConfigs) =>
38-
const _NoOpTarget();
43+
Target webServiceWorker(
44+
FileSystem fileSystem,
45+
List<WebCompilerConfig> compileConfigs,
46+
Analytics analytics,
47+
) => const _NoOpTarget();
3948
}
4049

4150
/// A [Target] that does nothing.

packages/flutter_tools/lib/src/build_system/targets/web.dart

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'dart:math';
66

77
import 'package:crypto/crypto.dart';
88
import 'package:package_config/package_config.dart';
9+
import 'package:unified_analytics/unified_analytics.dart';
910

1011
import '../../artifacts.dart';
1112
import '../../base/file_system.dart';
@@ -273,11 +274,13 @@ class Dart2JSTarget extends Dart2WebTarget {
273274

274275
/// Compiles a web entry point with dart2wasm.
275276
class Dart2WasmTarget extends Dart2WebTarget {
276-
Dart2WasmTarget(this.compilerConfig);
277+
Dart2WasmTarget(this.compilerConfig, this._analytics);
277278

278279
@override
279280
final WasmCompilerConfig compilerConfig;
280281

282+
final Analytics _analytics;
283+
281284
/// List the preconfigured build options for a given build mode.
282285
List<String> buildModeOptions(BuildMode mode, List<String> dartDefines) => switch (mode) {
283286
BuildMode.debug => <String>[
@@ -403,43 +406,59 @@ class Dart2WasmTarget extends Dart2WebTarget {
403406
final int exitCode = runResult.exitCode;
404407
final String stdout = runResult.stdout;
405408
final String stderr = runResult.stderr;
409+
final String result;
410+
String? findingsSummary;
411+
406412
if (exitCode != 0 && exitCode != 254) {
407413
environment.logger.printWarning('Unexpected wasm dry run failure ($exitCode):');
408414
if (stderr.isNotEmpty) {
409415
environment.logger.printWarning(stdout);
410416
environment.logger.printWarning(stderr);
411417
}
418+
result = 'crash';
412419
} else if (exitCode == 0) {
413420
environment.logger.printWarning(
414421
'Wasm dry run succeeded. Consider building and testing your application with the '
415422
'`--wasm` flag. See docs for more info: '
416423
'https://docs.flutter.dev/platform-integration/web/wasm',
417424
);
425+
result = 'success';
418426
} else if (stderr.isNotEmpty) {
419427
environment.logger.printWarning('Wasm dry run failed:');
420428
environment.logger.printWarning(stdout);
421429
environment.logger.printWarning(stderr);
430+
result = 'failure';
422431
} else if (stdout.isNotEmpty) {
423432
environment.logger.printWarning('Wasm dry run findings:');
424433
environment.logger.printWarning(stdout);
425434
environment.logger.printWarning(
426435
'Consider addressing these issues to enable wasm builds. See docs for more info: '
427436
'https://docs.flutter.dev/platform-integration/web/wasm\n',
428437
);
438+
result = 'findings';
439+
findingsSummary = RegExp(
440+
r'\(([0-9]+)\)',
441+
).allMatches(stdout).map((RegExpMatch f) => f.group(1)).join(',');
442+
} else {
443+
result = 'unknown';
429444
}
430445
environment.logger.printWarning('Use --no-wasm-dry-run to disable these warnings.');
446+
447+
_analytics.send(
448+
Event.flutterWasmDryRun(result: result, exitCode: exitCode, findingsSummary: findingsSummary),
449+
);
431450
}
432451
}
433452

434453
/// Unpacks the dart2js or dart2wasm compilation and resources to a given
435454
/// output directory.
436455
class WebReleaseBundle extends Target {
437-
WebReleaseBundle(List<WebCompilerConfig> configs)
456+
WebReleaseBundle(List<WebCompilerConfig> configs, Analytics analytics)
438457
: this._(
439458
compileTargets: configs
440459
.map(
441460
(WebCompilerConfig config) => switch (config) {
442-
WasmCompilerConfig() => Dart2WasmTarget(config),
461+
WasmCompilerConfig() => Dart2WasmTarget(config, analytics),
443462
JsCompilerConfig() => Dart2JSTarget(config),
444463
},
445464
)
@@ -743,17 +762,18 @@ class WebBuiltInAssets extends Target {
743762

744763
/// Generate a service worker for a web target.
745764
class WebServiceWorker extends Target {
746-
const WebServiceWorker(this.fileSystem, this.compileConfigs);
765+
const WebServiceWorker(this.fileSystem, this.compileConfigs, this.analytics);
747766

748767
final FileSystem fileSystem;
749768
final List<WebCompilerConfig> compileConfigs;
769+
final Analytics analytics;
750770

751771
@override
752772
String get name => 'web_service_worker';
753773

754774
@override
755775
List<Target> get dependencies => <Target>[
756-
WebReleaseBundle(compileConfigs),
776+
WebReleaseBundle(compileConfigs, analytics),
757777
WebBuiltInAssets(fileSystem),
758778
];
759779

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

Lines changed: 7 additions & 2 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/file_system.dart';
68
import '../build_system/build_system.dart';
79
import '../build_system/build_targets.dart';
@@ -27,6 +29,9 @@ class BuildTargetsImpl extends BuildTargets {
2729
Target get dartPluginRegistrantTarget => const DartPluginRegistrantTarget();
2830

2931
@override
30-
Target webServiceWorker(FileSystem fileSystem, List<WebCompilerConfig> compileConfigs) =>
31-
WebServiceWorker(fileSystem, compileConfigs);
32+
Target webServiceWorker(
33+
FileSystem fileSystem,
34+
List<WebCompilerConfig> compileConfigs,
35+
Analytics analytics,
36+
) => WebServiceWorker(fileSystem, compileConfigs, analytics);
3237
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ class WebBuilder {
8888
final Stopwatch sw = Stopwatch()..start();
8989
try {
9090
final BuildResult result = await _buildSystem.build(
91-
globals.buildTargets.webServiceWorker(_fileSystem, compilerConfigs),
91+
globals.buildTargets.webServiceWorker(_fileSystem, compilerConfigs, _analytics),
9292
Environment(
9393
projectDir: flutterProject.directory,
9494
outputDir: outputDirectory,

packages/flutter_tools/pubspec.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ dependencies:
5353
http_multi_server: 3.2.2
5454
convert: 3.1.2
5555
async: 2.13.0
56-
unified_analytics: 8.0.2
56+
unified_analytics: 8.0.5
5757
pubspec_parse: 1.5.0
5858

5959
graphs: 2.3.2
@@ -126,4 +126,4 @@ dev_dependencies:
126126
dartdoc:
127127
# Exclude this package from the hosted API docs.
128128
nodoc: true
129-
# PUBSPEC CHECKSUM: 36e76b
129+
# PUBSPEC CHECKSUM: kr614i

packages/flutter_tools/test/general.shard/build_system/targets/web_test.dart

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import 'package:flutter_tools/src/isolated/mustache_template.dart';
1717
import 'package:flutter_tools/src/web/compile.dart';
1818
import 'package:flutter_tools/src/web/file_generators/flutter_service_worker_js.dart';
1919
import 'package:flutter_tools/src/web_template.dart';
20+
import 'package:unified_analytics/unified_analytics.dart';
2021

2122
import '../../../src/common.dart';
2223
import '../../../src/fake_process_manager.dart';
@@ -133,7 +134,9 @@ name: foo
133134
final Directory webResources = environment.projectDir.childDirectory('web');
134135
webResources.childFile('index.html').createSync(recursive: true);
135136
environment.buildDir.childFile('main.dart.js').createSync();
136-
await WebReleaseBundle(<WebCompilerConfig>[const JsCompilerConfig()]).build(environment);
137+
await WebReleaseBundle(<WebCompilerConfig>[
138+
const JsCompilerConfig(),
139+
], const NoOpAnalytics()).build(environment);
137140

138141
expect(environment.outputDir.childFile('version.json'), exists);
139142
}),
@@ -148,7 +151,9 @@ name: foo
148151
final Directory webResources = environment.projectDir.childDirectory('web');
149152
webResources.childFile('index.html').createSync(recursive: true);
150153
environment.buildDir.childFile('main.dart.js').createSync();
151-
await WebReleaseBundle(<WebCompilerConfig>[const JsCompilerConfig()]).build(environment);
154+
await WebReleaseBundle(<WebCompilerConfig>[
155+
const JsCompilerConfig(),
156+
], const NoOpAnalytics()).build(environment);
152157

153158
final String versionFile = environment.outputDir.childFile('version.json').readAsStringSync();
154159
expect(versionFile, contains('"version":"2.0.0"'));
@@ -265,7 +270,7 @@ name: foo
265270

266271
await WebReleaseBundle(<WebCompilerConfig>[
267272
const JsCompilerConfig(dumpInfo: true),
268-
]).build(environment);
273+
], const NoOpAnalytics()).build(environment);
269274

270275
expect(environment.outputDir.childFile('foo.txt').readAsStringSync(), 'A');
271276
expect(environment.outputDir.childFile('main.dart.js').existsSync(), true);
@@ -284,7 +289,9 @@ name: foo
284289
// Update to arbitrary resource file triggers rebuild.
285290
webResources.childFile('foo.txt').writeAsStringSync('B');
286291

287-
await WebReleaseBundle(<WebCompilerConfig>[const JsCompilerConfig()]).build(environment);
292+
await WebReleaseBundle(<WebCompilerConfig>[
293+
const JsCompilerConfig(),
294+
], const NoOpAnalytics()).build(environment);
288295

289296
expect(environment.outputDir.childFile('foo.txt').readAsStringSync(), 'B');
290297
}),
@@ -304,7 +311,9 @@ name: foo
304311
environment.buildDir.childFile('main.dart.mjs')
305312
..createSync()
306313
..writeAsStringSync('old mjs');
307-
await WebReleaseBundle(<WebCompilerConfig>[const WasmCompilerConfig()]).build(environment);
314+
await WebReleaseBundle(<WebCompilerConfig>[
315+
const WasmCompilerConfig(),
316+
], const NoOpAnalytics()).build(environment);
308317
expect(environment.outputDir.childFile('main.dart.wasm').readAsStringSync(), 'old wasm');
309318
expect(environment.outputDir.childFile('main.dart.mjs').readAsStringSync(), 'old mjs');
310319

@@ -315,7 +324,9 @@ name: foo
315324
..createSync()
316325
..writeAsStringSync('new mjs');
317326

318-
await WebReleaseBundle(<WebCompilerConfig>[const WasmCompilerConfig()]).build(environment);
327+
await WebReleaseBundle(<WebCompilerConfig>[
328+
const WasmCompilerConfig(),
329+
], const NoOpAnalytics()).build(environment);
319330

320331
expect(environment.outputDir.childFile('main.dart.wasm').readAsStringSync(), 'new wasm');
321332
expect(environment.outputDir.childFile('main.dart.mjs').readAsStringSync(), 'new mjs');
@@ -1198,6 +1209,7 @@ name: foo
11981209
sourceMaps: sourceMaps,
11991210
minify: minify,
12001211
),
1212+
const NoOpAnalytics(),
12011213
).build(environment);
12021214

12031215
expect(outputJsFile.existsSync(), isTrue);
@@ -1267,7 +1279,7 @@ name: foo
12671279
];
12681280

12691281
final Iterable<String> buildKeys = testConfigs.map((WasmCompilerConfig config) {
1270-
final Dart2WasmTarget target = Dart2WasmTarget(config);
1282+
final Dart2WasmTarget target = Dart2WasmTarget(config, const NoOpAnalytics());
12711283
return target.buildKey;
12721284
});
12731285

@@ -1404,7 +1416,7 @@ name: foo
14041416
..writeAsStringSync('A');
14051417
await WebServiceWorker(globals.fs, <WebCompilerConfig>[
14061418
const JsCompilerConfig(),
1407-
]).build(environment);
1419+
], const NoOpAnalytics()).build(environment);
14081420

14091421
expect(environment.outputDir.childFile('flutter_service_worker.js'), exists);
14101422
// Contains file hash.
@@ -1435,7 +1447,7 @@ name: foo
14351447
..writeAsStringSync('A');
14361448
await WebServiceWorker(globals.fs, <WebCompilerConfig>[
14371449
const JsCompilerConfig(),
1438-
]).build(environment);
1450+
], const NoOpAnalytics()).build(environment);
14391451

14401452
expect(environment.outputDir.childFile('flutter_service_worker.js'), exists);
14411453
// Contains the same file hash for both `/` and the root index.html file.
@@ -1464,7 +1476,7 @@ name: foo
14641476
environment.outputDir.childFile('main.dart.js.map').createSync(recursive: true);
14651477
await WebServiceWorker(globals.fs, <WebCompilerConfig>[
14661478
const JsCompilerConfig(),
1467-
]).build(environment);
1479+
], const NoOpAnalytics()).build(environment);
14681480

14691481
// No caching of source maps.
14701482
expect(

0 commit comments

Comments
 (0)