Add `--trace-to-file` option to `flutter run` (#135713)
diff --git a/packages/flutter_tools/lib/src/android/android_device.dart b/packages/flutter_tools/lib/src/android/android_device.dart
index dd9e3d7..dc9bf5e 100644
--- a/packages/flutter_tools/lib/src/android/android_device.dart
+++ b/packages/flutter_tools/lib/src/android/android_device.dart
@@ -625,6 +625,7 @@
final String dartVmFlags = computeDartVmFlags(debuggingOptions);
final String? traceAllowlist = debuggingOptions.traceAllowlist;
final String? traceSkiaAllowlist = debuggingOptions.traceSkiaAllowlist;
+ final String? traceToFile = debuggingOptions.traceToFile;
final List<String> cmd = <String>[
'shell', 'am', 'start',
'-a', 'android.intent.action.MAIN',
@@ -648,6 +649,8 @@
...<String>['--es', 'trace-skia-allowlist', traceSkiaAllowlist],
if (debuggingOptions.traceSystrace)
...<String>['--ez', 'trace-systrace', 'true'],
+ if (traceToFile != null)
+ ...<String>['--es', 'trace-to-file', traceToFile],
if (debuggingOptions.endlessTraceBuffer)
...<String>['--ez', 'endless-trace-buffer', 'true'],
if (debuggingOptions.dumpSkpOnShaderCompilation)
diff --git a/packages/flutter_tools/lib/src/commands/run.dart b/packages/flutter_tools/lib/src/commands/run.dart
index bb6538f..3557095 100644
--- a/packages/flutter_tools/lib/src/commands/run.dart
+++ b/packages/flutter_tools/lib/src/commands/run.dart
@@ -119,6 +119,12 @@
'platforms where such a tracer is available (Android, iOS, '
'macOS and Fuchsia).',
)
+ ..addOption('trace-to-file',
+ help: 'Write the timeline trace to a file at the specified path. The '
+ "file will be in Perfetto's proto format; it will be possible to "
+ "load the file into Perfetto's trace viewer.",
+ valueHelp: 'path/to/trace.binpb',
+ )
..addFlag('trace-skia',
negatable: false,
help: 'Enable tracing of Skia code. This is useful when debugging '
@@ -270,6 +276,7 @@
traceAllowlist: traceAllowlist,
traceSkiaAllowlist: stringArg('trace-skia-allowlist'),
traceSystrace: boolArg('trace-systrace'),
+ traceToFile: stringArg('trace-to-file'),
endlessTraceBuffer: boolArg('endless-trace-buffer'),
dumpSkpOnShaderCompilation: dumpSkpOnShaderCompilation,
cacheSkSL: cacheSkSL,
diff --git a/packages/flutter_tools/lib/src/custom_devices/custom_device.dart b/packages/flutter_tools/lib/src/custom_devices/custom_device.dart
index f1bfead..817c3d4 100644
--- a/packages/flutter_tools/lib/src/custom_devices/custom_device.dart
+++ b/packages/flutter_tools/lib/src/custom_devices/custom_device.dart
@@ -300,6 +300,8 @@
'trace-allowlist=${debuggingOptions.traceAllowlist}',
if (debuggingOptions.traceSystrace)
'trace-systrace=true',
+ if (debuggingOptions.traceToFile != null)
+ 'trace-to-file=${debuggingOptions.traceToFile}',
if (debuggingOptions.endlessTraceBuffer)
'endless-trace-buffer=true',
if (debuggingOptions.dumpSkpOnShaderCompilation)
diff --git a/packages/flutter_tools/lib/src/desktop_device.dart b/packages/flutter_tools/lib/src/desktop_device.dart
index 8327177..6931a17 100644
--- a/packages/flutter_tools/lib/src/desktop_device.dart
+++ b/packages/flutter_tools/lib/src/desktop_device.dart
@@ -254,6 +254,9 @@
if (debuggingOptions.traceSystrace) {
addFlag('trace-systrace=true');
}
+ if (debuggingOptions.traceToFile != null) {
+ addFlag('trace-to-file=${debuggingOptions.traceToFile}');
+ }
if (debuggingOptions.endlessTraceBuffer) {
addFlag('endless-trace-buffer=true');
}
diff --git a/packages/flutter_tools/lib/src/device.dart b/packages/flutter_tools/lib/src/device.dart
index aecf35a..869751e 100644
--- a/packages/flutter_tools/lib/src/device.dart
+++ b/packages/flutter_tools/lib/src/device.dart
@@ -937,6 +937,7 @@
this.traceAllowlist,
this.traceSkiaAllowlist,
this.traceSystrace = false,
+ this.traceToFile,
this.endlessTraceBuffer = false,
this.dumpSkpOnShaderCompilation = false,
this.cacheSkSL = false,
@@ -1006,6 +1007,7 @@
traceSkia = false,
traceSkiaAllowlist = null,
traceSystrace = false,
+ traceToFile = null,
endlessTraceBuffer = false,
dumpSkpOnShaderCompilation = false,
purgePersistentCache = false,
@@ -1037,6 +1039,7 @@
required this.traceAllowlist,
required this.traceSkiaAllowlist,
required this.traceSystrace,
+ required this.traceToFile,
required this.endlessTraceBuffer,
required this.dumpSkpOnShaderCompilation,
required this.cacheSkSL,
@@ -1088,6 +1091,7 @@
final String? traceAllowlist;
final String? traceSkiaAllowlist;
final bool traceSystrace;
+ final String? traceToFile;
final bool endlessTraceBuffer;
final bool dumpSkpOnShaderCompilation;
final bool cacheSkSL;
@@ -1178,6 +1182,7 @@
],
if (enableSoftwareRendering) '--enable-software-rendering',
if (traceSystrace) '--trace-systrace',
+ if (traceToFile != null) '--trace-to-file="$traceToFile"',
if (skiaDeterministicRendering) '--skia-deterministic-rendering',
if (traceSkia) '--trace-skia',
if (traceAllowlist != null) '--trace-allowlist="$traceAllowlist"',
@@ -1218,6 +1223,7 @@
'traceAllowlist': traceAllowlist,
'traceSkiaAllowlist': traceSkiaAllowlist,
'traceSystrace': traceSystrace,
+ 'traceToFile': traceToFile,
'endlessTraceBuffer': endlessTraceBuffer,
'dumpSkpOnShaderCompilation': dumpSkpOnShaderCompilation,
'cacheSkSL': cacheSkSL,
@@ -1269,6 +1275,7 @@
traceAllowlist: json['traceAllowlist'] as String?,
traceSkiaAllowlist: json['traceSkiaAllowlist'] as String?,
traceSystrace: json['traceSystrace']! as bool,
+ traceToFile: json['traceToFile'] as String?,
endlessTraceBuffer: json['endlessTraceBuffer']! as bool,
dumpSkpOnShaderCompilation: json['dumpSkpOnShaderCompilation']! as bool,
cacheSkSL: json['cacheSkSL']! as bool,
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/drive_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/drive_test.dart
index f3df962..ec7194f 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/drive_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/drive_test.dart
@@ -417,6 +417,7 @@
'--disable-service-auth-codes',
'--trace-skia',
'--trace-systrace',
+ '--trace-to-file=path/to/trace.binpb',
'--verbose-system-logs',
'--null-assertions',
'--native-null-assertions',
@@ -434,6 +435,7 @@
expect(options.disableServiceAuthCodes, true);
expect(options.traceSkia, true);
expect(options.traceSystrace, true);
+ expect(options.traceToFile, 'path/to/trace.binpb');
expect(options.verboseSystemLogs, true);
expect(options.nullAssertions, true);
expect(options.nativeNullAssertions, true);
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart
index 2a5a644..81ec6c1 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart
@@ -1086,6 +1086,7 @@
'--use-test-fonts',
'--trace-skia',
'--trace-systrace',
+ '--trace-to-file=path/to/trace.binpb',
'--verbose-system-logs',
'--null-assertions',
'--native-null-assertions',
@@ -1106,6 +1107,7 @@
expect(options.useTestFonts, true);
expect(options.traceSkia, true);
expect(options.traceSystrace, true);
+ expect(options.traceToFile, 'path/to/trace.binpb');
expect(options.verboseSystemLogs, true);
expect(options.nullAssertions, true);
expect(options.nativeNullAssertions, true);
diff --git a/packages/flutter_tools/test/general.shard/android/android_device_start_test.dart b/packages/flutter_tools/test/general.shard/android/android_device_start_test.dart
index e426cd3..186f507 100644
--- a/packages/flutter_tools/test/general.shard/android/android_device_start_test.dart
+++ b/packages/flutter_tools/test/general.shard/android/android_device_start_test.dart
@@ -240,6 +240,7 @@
'--es', 'trace-allowlist', 'bar,baz',
'--es', 'trace-skia-allowlist', 'skia.a,skia.b',
'--ez', 'trace-systrace', 'true',
+ '--es', 'trace-to-file', 'path/to/trace.binpb',
'--ez', 'endless-trace-buffer', 'true',
'--ez', 'dump-skp-on-shader-compilation', 'true',
'--ez', 'cache-sksl', 'true',
@@ -271,6 +272,7 @@
traceAllowlist: 'bar,baz',
traceSkiaAllowlist: 'skia.a,skia.b',
traceSystrace: true,
+ traceToFile: 'path/to/trace.binpb',
endlessTraceBuffer: true,
dumpSkpOnShaderCompilation: true,
cacheSkSL: true,
diff --git a/packages/flutter_tools/test/general.shard/desktop_device_test.dart b/packages/flutter_tools/test/general.shard/desktop_device_test.dart
index 3989047..b42194d 100644
--- a/packages/flutter_tools/test/general.shard/desktop_device_test.dart
+++ b/packages/flutter_tools/test/general.shard/desktop_device_test.dart
@@ -151,19 +151,20 @@
'FLUTTER_ENGINE_SWITCH_6': 'trace-allowlist=foo,bar',
'FLUTTER_ENGINE_SWITCH_7': 'trace-skia-allowlist=skia.a,skia.b',
'FLUTTER_ENGINE_SWITCH_8': 'trace-systrace=true',
- 'FLUTTER_ENGINE_SWITCH_9': 'endless-trace-buffer=true',
- 'FLUTTER_ENGINE_SWITCH_10': 'dump-skp-on-shader-compilation=true',
- 'FLUTTER_ENGINE_SWITCH_11': 'cache-sksl=true',
- 'FLUTTER_ENGINE_SWITCH_12': 'purge-persistent-cache=true',
- 'FLUTTER_ENGINE_SWITCH_13': 'enable-impeller=false',
- 'FLUTTER_ENGINE_SWITCH_14': 'enable-checked-mode=true',
- 'FLUTTER_ENGINE_SWITCH_15': 'verify-entry-points=true',
- 'FLUTTER_ENGINE_SWITCH_16': 'start-paused=true',
- 'FLUTTER_ENGINE_SWITCH_17': 'disable-service-auth-codes=true',
- 'FLUTTER_ENGINE_SWITCH_18': 'dart-flags=--null_assertions',
- 'FLUTTER_ENGINE_SWITCH_19': 'use-test-fonts=true',
- 'FLUTTER_ENGINE_SWITCH_20': 'verbose-logging=true',
- 'FLUTTER_ENGINE_SWITCHES': '20',
+ 'FLUTTER_ENGINE_SWITCH_9': 'trace-to-file=path/to/trace.binpb',
+ 'FLUTTER_ENGINE_SWITCH_10': 'endless-trace-buffer=true',
+ 'FLUTTER_ENGINE_SWITCH_11': 'dump-skp-on-shader-compilation=true',
+ 'FLUTTER_ENGINE_SWITCH_12': 'cache-sksl=true',
+ 'FLUTTER_ENGINE_SWITCH_13': 'purge-persistent-cache=true',
+ 'FLUTTER_ENGINE_SWITCH_14': 'enable-impeller=false',
+ 'FLUTTER_ENGINE_SWITCH_15': 'enable-checked-mode=true',
+ 'FLUTTER_ENGINE_SWITCH_16': 'verify-entry-points=true',
+ 'FLUTTER_ENGINE_SWITCH_17': 'start-paused=true',
+ 'FLUTTER_ENGINE_SWITCH_18': 'disable-service-auth-codes=true',
+ 'FLUTTER_ENGINE_SWITCH_19': 'dart-flags=--null_assertions',
+ 'FLUTTER_ENGINE_SWITCH_20': 'use-test-fonts=true',
+ 'FLUTTER_ENGINE_SWITCH_21': 'verbose-logging=true',
+ 'FLUTTER_ENGINE_SWITCHES': '21',
}
),
]);
@@ -185,6 +186,7 @@
traceAllowlist: 'foo,bar',
traceSkiaAllowlist: 'skia.a,skia.b',
traceSystrace: true,
+ traceToFile: 'path/to/trace.binpb',
endlessTraceBuffer: true,
dumpSkpOnShaderCompilation: true,
cacheSkSL: true,
diff --git a/packages/flutter_tools/test/general.shard/device_test.dart b/packages/flutter_tools/test/general.shard/device_test.dart
index 14e3dbb..74af292 100644
--- a/packages/flutter_tools/test/general.shard/device_test.dart
+++ b/packages/flutter_tools/test/general.shard/device_test.dart
@@ -814,6 +814,7 @@
traceAllowlist: 'foo',
traceSkiaAllowlist: 'skia.a,skia.b',
traceSystrace: true,
+ traceToFile: 'path/to/trace.binpb',
endlessTraceBuffer: true,
dumpSkpOnShaderCompilation: true,
cacheSkSL: true,
@@ -846,6 +847,7 @@
'--verify-entry-points',
'--enable-software-rendering',
'--trace-systrace',
+ '--trace-to-file="path/to/trace.binpb"',
'--skia-deterministic-rendering',
'--trace-skia',
'--trace-allowlist="foo"',
@@ -994,6 +996,7 @@
traceAllowlist: 'foo',
traceSkiaAllowlist: 'skia.a,skia.b',
traceSystrace: true,
+ traceToFile: 'path/to/trace.binpb',
endlessTraceBuffer: true,
dumpSkpOnShaderCompilation: true,
cacheSkSL: true,
@@ -1026,6 +1029,7 @@
'--verify-entry-points',
'--enable-software-rendering',
'--trace-systrace',
+ '--trace-to-file="path/to/trace.binpb"',
'--skia-deterministic-rendering',
'--trace-skia',
'--trace-allowlist="foo"',
diff --git a/packages/flutter_tools/test/general.shard/ios/ios_device_start_prebuilt_test.dart b/packages/flutter_tools/test/general.shard/ios/ios_device_start_prebuilt_test.dart
index 90f8340..117888a 100644
--- a/packages/flutter_tools/test/general.shard/ios/ios_device_start_prebuilt_test.dart
+++ b/packages/flutter_tools/test/general.shard/ios/ios_device_start_prebuilt_test.dart
@@ -485,6 +485,7 @@
'--verify-entry-points',
'--enable-software-rendering',
'--trace-systrace',
+ '--trace-to-file="path/to/trace.binpb"',
'--skia-deterministic-rendering',
'--trace-skia',
'--trace-allowlist="foo"',
@@ -541,6 +542,7 @@
traceAllowlist: 'foo',
traceSkiaAllowlist: 'skia.a,skia.b',
traceSystrace: true,
+ traceToFile: 'path/to/trace.binpb',
endlessTraceBuffer: true,
dumpSkpOnShaderCompilation: true,
cacheSkSL: true,
diff --git a/packages/flutter_tools/test/general.shard/ios/simulators_test.dart b/packages/flutter_tools/test/general.shard/ios/simulators_test.dart
index f3830d0..3748510 100644
--- a/packages/flutter_tools/test/general.shard/ios/simulators_test.dart
+++ b/packages/flutter_tools/test/general.shard/ios/simulators_test.dart
@@ -1184,6 +1184,7 @@
mockInfo,
enableSoftwareRendering: true,
traceSystrace: true,
+ traceToFile: 'path/to/trace.binpb',
startPaused: true,
disableServiceAuthCodes: true,
skiaDeterministicRendering: true,
@@ -1209,6 +1210,7 @@
'--verify-entry-points',
'--enable-software-rendering',
'--trace-systrace',
+ '--trace-to-file="path/to/trace.binpb"',
'--start-paused',
'--disable-service-auth-codes',
'--skia-deterministic-rendering',