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