Unverified Commit 75baed58 authored by Ben Konyi's avatar Ben Konyi Committed by GitHub

Reland "Enable caching of CPU samples collected at application startup (#89600)" (#100995)

parent d0215091
...@@ -17,6 +17,7 @@ Future<dds.DartDevelopmentService> Function( ...@@ -17,6 +17,7 @@ Future<dds.DartDevelopmentService> Function(
bool enableAuthCodes, bool enableAuthCodes,
bool ipv6, bool ipv6,
Uri? serviceUri, Uri? serviceUri,
List<String> cachedUserTags,
}) ddsLauncherCallback = dds.DartDevelopmentService.startDartDevelopmentService; }) ddsLauncherCallback = dds.DartDevelopmentService.startDartDevelopmentService;
/// Helper class to launch a [dds.DartDevelopmentService]. Allows for us to /// Helper class to launch a [dds.DartDevelopmentService]. Allows for us to
...@@ -36,6 +37,7 @@ class DartDevelopmentService { ...@@ -36,6 +37,7 @@ class DartDevelopmentService {
int? hostPort, int? hostPort,
bool? ipv6, bool? ipv6,
bool? disableServiceAuthCodes, bool? disableServiceAuthCodes,
bool cacheStartupProfile = false,
}) async { }) async {
final Uri ddsUri = Uri( final Uri ddsUri = Uri(
scheme: 'http', scheme: 'http',
...@@ -52,6 +54,8 @@ class DartDevelopmentService { ...@@ -52,6 +54,8 @@ class DartDevelopmentService {
serviceUri: ddsUri, serviceUri: ddsUri,
enableAuthCodes: disableServiceAuthCodes != true, enableAuthCodes: disableServiceAuthCodes != true,
ipv6: ipv6 ?? false, ipv6: ipv6 ?? false,
// Enables caching of CPU samples collected during application startup.
cachedUserTags: cacheStartupProfile ? const <String>['AppStartUp'] : const <String>[],
); );
unawaited(_ddsInstance?.done.whenComplete(() { unawaited(_ddsInstance?.done.whenComplete(() {
if (!_completer.isCompleted) { if (!_completer.isCompleted) {
......
...@@ -46,6 +46,10 @@ abstract class RunCommandBase extends FlutterCommand with DeviceBasedDevelopment ...@@ -46,6 +46,10 @@ abstract class RunCommandBase extends FlutterCommand with DeviceBasedDevelopment
'FLUTTER_TEST_OUTPUTS_DIR environment variable is set, the file ' 'FLUTTER_TEST_OUTPUTS_DIR environment variable is set, the file '
'will be written there instead.', 'will be written there instead.',
) )
..addFlag('cache-startup-profile',
help: 'Caches the CPU profile collected before the first frame for startup '
'analysis.',
)
..addFlag('verbose-system-logs', ..addFlag('verbose-system-logs',
negatable: false, negatable: false,
help: 'Include verbose logging from the Flutter engine.', help: 'Include verbose logging from the Flutter engine.',
...@@ -163,6 +167,7 @@ abstract class RunCommandBase extends FlutterCommand with DeviceBasedDevelopment ...@@ -163,6 +167,7 @@ abstract class RunCommandBase extends FlutterCommand with DeviceBasedDevelopment
bool get dumpSkpOnShaderCompilation => boolArg('dump-skp-on-shader-compilation'); bool get dumpSkpOnShaderCompilation => boolArg('dump-skp-on-shader-compilation');
bool get purgePersistentCache => boolArg('purge-persistent-cache'); bool get purgePersistentCache => boolArg('purge-persistent-cache');
bool get disableServiceAuthCodes => boolArg('disable-service-auth-codes'); bool get disableServiceAuthCodes => boolArg('disable-service-auth-codes');
bool get cacheStartupProfile => boolArg('cache-startup-profile');
bool get runningWithPrebuiltApplication => argResults['use-application-binary'] != null; bool get runningWithPrebuiltApplication => argResults['use-application-binary'] != null;
bool get trackWidgetCreation => boolArg('track-widget-creation'); bool get trackWidgetCreation => boolArg('track-widget-creation');
bool get enableImpeller => boolArg('enable-impeller'); bool get enableImpeller => boolArg('enable-impeller');
...@@ -202,6 +207,7 @@ abstract class RunCommandBase extends FlutterCommand with DeviceBasedDevelopment ...@@ -202,6 +207,7 @@ abstract class RunCommandBase extends FlutterCommand with DeviceBasedDevelopment
buildInfo, buildInfo,
startPaused: boolArg('start-paused'), startPaused: boolArg('start-paused'),
disableServiceAuthCodes: boolArg('disable-service-auth-codes'), disableServiceAuthCodes: boolArg('disable-service-auth-codes'),
cacheStartupProfile: cacheStartupProfile,
enableDds: enableDds, enableDds: enableDds,
dartEntrypointArgs: stringsArg('dart-entrypoint-args'), dartEntrypointArgs: stringsArg('dart-entrypoint-args'),
dartFlags: stringArg('dart-flags') ?? '', dartFlags: stringArg('dart-flags') ?? '',
......
...@@ -757,6 +757,7 @@ class DebuggingOptions { ...@@ -757,6 +757,7 @@ class DebuggingOptions {
this.startPaused = false, this.startPaused = false,
this.disableServiceAuthCodes = false, this.disableServiceAuthCodes = false,
this.enableDds = true, this.enableDds = true,
this.cacheStartupProfile = false,
this.dartEntrypointArgs = const <String>[], this.dartEntrypointArgs = const <String>[],
this.dartFlags = '', this.dartFlags = '',
this.enableSoftwareRendering = false, this.enableSoftwareRendering = false,
...@@ -813,6 +814,7 @@ class DebuggingOptions { ...@@ -813,6 +814,7 @@ class DebuggingOptions {
dartFlags = '', dartFlags = '',
disableServiceAuthCodes = false, disableServiceAuthCodes = false,
enableDds = true, enableDds = true,
cacheStartupProfile = false,
enableSoftwareRendering = false, enableSoftwareRendering = false,
skiaDeterministicRendering = false, skiaDeterministicRendering = false,
traceSkia = false, traceSkia = false,
...@@ -841,6 +843,7 @@ class DebuggingOptions { ...@@ -841,6 +843,7 @@ class DebuggingOptions {
required this.dartEntrypointArgs, required this.dartEntrypointArgs,
required this.disableServiceAuthCodes, required this.disableServiceAuthCodes,
required this.enableDds, required this.enableDds,
required this.cacheStartupProfile,
required this.enableSoftwareRendering, required this.enableSoftwareRendering,
required this.skiaDeterministicRendering, required this.skiaDeterministicRendering,
required this.traceSkia, required this.traceSkia,
...@@ -883,6 +886,7 @@ class DebuggingOptions { ...@@ -883,6 +886,7 @@ class DebuggingOptions {
final List<String> dartEntrypointArgs; final List<String> dartEntrypointArgs;
final bool disableServiceAuthCodes; final bool disableServiceAuthCodes;
final bool enableDds; final bool enableDds;
final bool cacheStartupProfile;
final bool enableSoftwareRendering; final bool enableSoftwareRendering;
final bool skiaDeterministicRendering; final bool skiaDeterministicRendering;
final bool traceSkia; final bool traceSkia;
...@@ -945,6 +949,7 @@ class DebuggingOptions { ...@@ -945,6 +949,7 @@ class DebuggingOptions {
'dartEntrypointArgs': dartEntrypointArgs, 'dartEntrypointArgs': dartEntrypointArgs,
'disableServiceAuthCodes': disableServiceAuthCodes, 'disableServiceAuthCodes': disableServiceAuthCodes,
'enableDds': enableDds, 'enableDds': enableDds,
'cacheStartupProfile': cacheStartupProfile,
'enableSoftwareRendering': enableSoftwareRendering, 'enableSoftwareRendering': enableSoftwareRendering,
'skiaDeterministicRendering': skiaDeterministicRendering, 'skiaDeterministicRendering': skiaDeterministicRendering,
'traceSkia': traceSkia, 'traceSkia': traceSkia,
...@@ -988,6 +993,7 @@ class DebuggingOptions { ...@@ -988,6 +993,7 @@ class DebuggingOptions {
dartEntrypointArgs: ((json['dartEntrypointArgs'] as List<dynamic>?)?.cast<String>())!, dartEntrypointArgs: ((json['dartEntrypointArgs'] as List<dynamic>?)?.cast<String>())!,
disableServiceAuthCodes: (json['disableServiceAuthCodes'] as bool?)!, disableServiceAuthCodes: (json['disableServiceAuthCodes'] as bool?)!,
enableDds: (json['enableDds'] as bool?)!, enableDds: (json['enableDds'] as bool?)!,
cacheStartupProfile: (json['cacheStartupProfile'] as bool?)!,
enableSoftwareRendering: (json['enableSoftwareRendering'] as bool?)!, enableSoftwareRendering: (json['enableSoftwareRendering'] as bool?)!,
skiaDeterministicRendering: (json['skiaDeterministicRendering'] as bool?)!, skiaDeterministicRendering: (json['skiaDeterministicRendering'] as bool?)!,
traceSkia: (json['traceSkia'] as bool?)!, traceSkia: (json['traceSkia'] as bool?)!,
......
...@@ -224,6 +224,7 @@ class FlutterDevice { ...@@ -224,6 +224,7 @@ class FlutterDevice {
int hostVmServicePort, int hostVmServicePort,
int ddsPort, int ddsPort,
bool disableServiceAuthCodes = false, bool disableServiceAuthCodes = false,
bool cacheStartupProfile = false,
bool enableDds = true, bool enableDds = true,
@required bool allowExistingDdsInstance, @required bool allowExistingDdsInstance,
bool ipv6 = false, bool ipv6 = false,
...@@ -269,6 +270,7 @@ class FlutterDevice { ...@@ -269,6 +270,7 @@ class FlutterDevice {
ipv6: ipv6, ipv6: ipv6,
disableServiceAuthCodes: disableServiceAuthCodes, disableServiceAuthCodes: disableServiceAuthCodes,
logger: globals.logger, logger: globals.logger,
cacheStartupProfile: cacheStartupProfile,
); );
} on dds.DartDevelopmentServiceException catch (e, st) { } on dds.DartDevelopmentServiceException catch (e, st) {
if (!allowExistingDdsInstance || if (!allowExistingDdsInstance ||
...@@ -1298,7 +1300,8 @@ abstract class ResidentRunner extends ResidentHandlers { ...@@ -1298,7 +1300,8 @@ abstract class ResidentRunner extends ResidentHandlers {
getSkSLMethod: getSkSLMethod, getSkSLMethod: getSkSLMethod,
printStructuredErrorLogMethod: printStructuredErrorLog, printStructuredErrorLogMethod: printStructuredErrorLog,
ipv6: ipv6, ipv6: ipv6,
disableServiceAuthCodes: debuggingOptions.disableServiceAuthCodes disableServiceAuthCodes: debuggingOptions.disableServiceAuthCodes,
cacheStartupProfile: debuggingOptions.cacheStartupProfile,
); );
await device.vmService.getFlutterViews(); await device.vmService.getFlutterViews();
......
...@@ -802,6 +802,7 @@ class FakeDartDevelopmentService extends Fake implements DartDevelopmentService ...@@ -802,6 +802,7 @@ class FakeDartDevelopmentService extends Fake implements DartDevelopmentService
int hostPort, int hostPort,
bool ipv6, bool ipv6,
bool disableServiceAuthCodes, bool disableServiceAuthCodes,
bool cacheStartupProfile = false,
}) async {} }) async {}
@override @override
......
...@@ -216,6 +216,7 @@ class TestFlutterDevice extends FlutterDevice { ...@@ -216,6 +216,7 @@ class TestFlutterDevice extends FlutterDevice {
GetSkSLMethod getSkSLMethod, GetSkSLMethod getSkSLMethod,
PrintStructuredErrorLogMethod printStructuredErrorLogMethod, PrintStructuredErrorLogMethod printStructuredErrorLogMethod,
bool enableDds = true, bool enableDds = true,
bool cacheStartupProfile = false,
bool disableServiceAuthCodes = false, bool disableServiceAuthCodes = false,
int hostVmServicePort, int hostVmServicePort,
int ddsPort, int ddsPort,
......
...@@ -590,6 +590,7 @@ class FakeDartDevelopmentService extends Fake implements DartDevelopmentService ...@@ -590,6 +590,7 @@ class FakeDartDevelopmentService extends Fake implements DartDevelopmentService
int hostPort, int hostPort,
bool ipv6, bool ipv6,
bool disableServiceAuthCodes, bool disableServiceAuthCodes,
bool cacheStartupProfile = false,
}) async { }) async {
started = true; started = true;
} }
......
...@@ -944,6 +944,7 @@ class FakeDartDevelopmentService extends Fake implements DartDevelopmentService ...@@ -944,6 +944,7 @@ class FakeDartDevelopmentService extends Fake implements DartDevelopmentService
int hostPort, int hostPort,
bool ipv6, bool ipv6,
bool disableServiceAuthCodes, bool disableServiceAuthCodes,
bool cacheStartupProfile = false,
}) async {} }) async {}
@override @override
......
...@@ -709,6 +709,7 @@ class TestFlutterDevice extends FlutterDevice { ...@@ -709,6 +709,7 @@ class TestFlutterDevice extends FlutterDevice {
PrintStructuredErrorLogMethod printStructuredErrorLogMethod, PrintStructuredErrorLogMethod printStructuredErrorLogMethod,
bool disableServiceAuthCodes = false, bool disableServiceAuthCodes = false,
bool enableDds = true, bool enableDds = true,
bool cacheStartupProfile = false,
bool ipv6 = false, bool ipv6 = false,
int hostVmServicePort, int hostVmServicePort,
int ddsPort, int ddsPort,
......
...@@ -1916,11 +1916,12 @@ flutter: ...@@ -1916,11 +1916,12 @@ flutter:
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]); fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
final FakeDevice device = FakeDevice() final FakeDevice device = FakeDevice()
..dds = DartDevelopmentService(); ..dds = DartDevelopmentService();
ddsLauncherCallback = (Uri uri, {bool enableAuthCodes, bool ipv6, Uri serviceUri}) { ddsLauncherCallback = (Uri uri, {bool enableAuthCodes, bool ipv6, Uri serviceUri, List<String> cachedUserTags}) {
expect(uri, Uri(scheme: 'foo', host: 'bar')); expect(uri, Uri(scheme: 'foo', host: 'bar'));
expect(enableAuthCodes, isTrue); expect(enableAuthCodes, isTrue);
expect(ipv6, isFalse); expect(ipv6, isFalse);
expect(serviceUri, Uri(scheme: 'http', host: '127.0.0.1', port: 0)); expect(serviceUri, Uri(scheme: 'http', host: '127.0.0.1', port: 0));
expect(cachedUserTags, isEmpty);
throw FakeDartDevelopmentServiceException(message: throw FakeDartDevelopmentServiceException(message:
'Existing VM service clients prevent DDS from taking control.', 'Existing VM service clients prevent DDS from taking control.',
); );
...@@ -1963,11 +1964,12 @@ flutter: ...@@ -1963,11 +1964,12 @@ flutter:
final FakeDevice device = FakeDevice() final FakeDevice device = FakeDevice()
..dds = DartDevelopmentService(); ..dds = DartDevelopmentService();
final Completer<void>done = Completer<void>(); final Completer<void>done = Completer<void>();
ddsLauncherCallback = (Uri uri, {bool enableAuthCodes, bool ipv6, Uri serviceUri}) async { ddsLauncherCallback = (Uri uri, {bool enableAuthCodes, bool ipv6, Uri serviceUri, List<String> cachedUserTags}) async {
expect(uri, Uri(scheme: 'foo', host: 'bar')); expect(uri, Uri(scheme: 'foo', host: 'bar'));
expect(enableAuthCodes, isFalse); expect(enableAuthCodes, isFalse);
expect(ipv6, isTrue); expect(ipv6, isTrue);
expect(serviceUri, Uri(scheme: 'http', host: '::1', port: 0)); expect(serviceUri, Uri(scheme: 'http', host: '::1', port: 0));
expect(cachedUserTags, isEmpty);
done.complete(); done.complete();
return null; return null;
}; };
...@@ -1994,11 +1996,12 @@ flutter: ...@@ -1994,11 +1996,12 @@ flutter:
// See https://github.com/flutter/flutter/issues/72385 for context. // See https://github.com/flutter/flutter/issues/72385 for context.
final FakeDevice device = FakeDevice() final FakeDevice device = FakeDevice()
..dds = DartDevelopmentService(); ..dds = DartDevelopmentService();
ddsLauncherCallback = (Uri uri, {bool enableAuthCodes, bool ipv6, Uri serviceUri}) { ddsLauncherCallback = (Uri uri, {bool enableAuthCodes, bool ipv6, Uri serviceUri, List<String> cachedUserTags}) {
expect(uri, Uri(scheme: 'foo', host: 'bar')); expect(uri, Uri(scheme: 'foo', host: 'bar'));
expect(enableAuthCodes, isTrue); expect(enableAuthCodes, isTrue);
expect(ipv6, isFalse); expect(ipv6, isFalse);
expect(serviceUri, Uri(scheme: 'http', host: '127.0.0.1', port: 0)); expect(serviceUri, Uri(scheme: 'http', host: '127.0.0.1', port: 0));
expect(cachedUserTags, isEmpty);
throw FakeDartDevelopmentServiceException(message: 'No URI'); throw FakeDartDevelopmentServiceException(message: 'No URI');
}; };
final TestFlutterDevice flutterDevice = TestFlutterDevice( final TestFlutterDevice flutterDevice = TestFlutterDevice(
...@@ -2226,6 +2229,7 @@ class FakeFlutterDevice extends Fake implements FlutterDevice { ...@@ -2226,6 +2229,7 @@ class FakeFlutterDevice extends Fake implements FlutterDevice {
int ddsPort, int ddsPort,
bool disableServiceAuthCodes = false, bool disableServiceAuthCodes = false,
bool enableDds = true, bool enableDds = true,
bool cacheStartupProfile = false,
@required bool allowExistingDdsInstance, @required bool allowExistingDdsInstance,
bool ipv6 = false, bool ipv6 = false,
}) async { } }) async { }
...@@ -2268,6 +2272,7 @@ class FakeDelegateFlutterDevice extends FlutterDevice { ...@@ -2268,6 +2272,7 @@ class FakeDelegateFlutterDevice extends FlutterDevice {
ReloadSources reloadSources, ReloadSources reloadSources,
Restart restart, Restart restart,
bool enableDds = true, bool enableDds = true,
bool cacheStartupProfile = false,
bool disableServiceAuthCodes = false, bool disableServiceAuthCodes = false,
bool ipv6 = false, bool ipv6 = false,
CompileExpression compileExpression, CompileExpression compileExpression,
......
...@@ -1348,6 +1348,7 @@ class FakeFlutterDevice extends Fake implements FlutterDevice { ...@@ -1348,6 +1348,7 @@ class FakeFlutterDevice extends Fake implements FlutterDevice {
int ddsPort, int ddsPort,
bool disableServiceAuthCodes = false, bool disableServiceAuthCodes = false,
bool enableDds = true, bool enableDds = true,
bool cacheStartupProfile = false,
@required bool allowExistingDdsInstance, @required bool allowExistingDdsInstance,
bool ipv6 = false, bool ipv6 = false,
}) async { } }) async { }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment