Unverified Commit 85df73d0 authored by Jonah Williams's avatar Jonah Williams Committed by GitHub

[flutter] ensure vmservice binding is registered in profile mode (#83913)

parent f41fa9dd
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:flutter_devicelab/framework/adb.dart';
import 'package:flutter_devicelab/framework/framework.dart';
import 'package:flutter_devicelab/framework/utils.dart';
import 'package:flutter_devicelab/tasks/perf_tests.dart';
Future<void> main() async {
deviceOperatingSystem = DeviceOperatingSystem.android;
await task(DevtoolsStartupTest(
'${flutterDirectory.path}/examples/hello_world',
).run);
}
......@@ -15,6 +15,8 @@ import 'package:flutter_devicelab/framework/utils.dart';
import 'package:meta/meta.dart';
import 'package:path/path.dart' as path;
import '../common.dart';
/// Must match flutter_driver/lib/src/common.dart.
///
/// Redefined here to avoid taking a dependency on flutter_driver.
......@@ -615,6 +617,106 @@ class StartupTest {
}
}
/// A one-off test to verify that devtools starts in profile mode.
class DevtoolsStartupTest {
const DevtoolsStartupTest(this.testDirectory);
final String testDirectory;
Future<TaskResult> run() async {
return inDirectory<TaskResult>(testDirectory, () async {
final Device device = await devices.workingDevice;
section('Building application');
String applicationBinaryPath;
switch (deviceOperatingSystem) {
case DeviceOperatingSystem.android:
await flutter('build', options: <String>[
'apk',
'-v',
'--profile',
'--target-platform=android-arm,android-arm64',
]);
applicationBinaryPath = '$testDirectory/build/app/outputs/flutter-apk/app-profile.apk';
break;
case DeviceOperatingSystem.androidArm:
await flutter('build', options: <String>[
'apk',
'-v',
'--profile',
'--target-platform=android-arm',
]);
applicationBinaryPath = '$testDirectory/build/app/outputs/flutter-apk/app-profile.apk';
break;
case DeviceOperatingSystem.androidArm64:
await flutter('build', options: <String>[
'apk',
'-v',
'--profile',
'--target-platform=android-arm64',
]);
applicationBinaryPath = '$testDirectory/build/app/outputs/flutter-apk/app-profile.apk';
break;
case DeviceOperatingSystem.ios:
await flutter('build', options: <String>[
'ios',
'-v',
'--profile',
]);
applicationBinaryPath = _findIosAppInBuildDirectory('$testDirectory/build/ios/iphoneos');
break;
case DeviceOperatingSystem.fuchsia:
case DeviceOperatingSystem.fake:
break;
}
final Process process = await startProcess(path.join(flutterDirectory.path, 'bin', 'flutter'), <String>[
'run',
'--no-android-gradle-daemon',
'--no-publish-port',
'--verbose',
'--profile',
'-d',
device.deviceId,
if (applicationBinaryPath != null)
'--use-application-binary=$applicationBinaryPath',
]);
final Completer<void> completer = Completer<void>();
bool sawLine = false;
process.stdout
.transform(utf8.decoder)
.transform(const LineSplitter())
.listen((String line) {
print('[STDOUT]: $line');
// Wait for devtools output.
if (line.contains('The Flutter DevTools debugger and profiler')) {
sawLine = true;
completer.complete();
}
});
bool didExit = false;
unawaited(process.exitCode.whenComplete(() {
didExit = true;
}));
await Future.any(<Future<void>>[completer.future, Future<void>.delayed(const Duration(minutes: 5)), process.exitCode]);
if (!didExit) {
process.stdin.writeln('q');
await process.exitCode;
}
await flutter('install', options: <String>[
'--uninstall-only',
'-d',
device.deviceId,
]);
if (sawLine)
return TaskResult.success(null, benchmarkScoreKeys: <String>[]);
return TaskResult.failure('Did not see line "The Flutter DevTools debugger and profiler" in output');
});
}
}
/// Measures application runtime performance, specifically per-frame
/// performance.
class PerfTest {
......
......@@ -169,10 +169,27 @@ abstract class BindingBase {
return true;
}());
if (!kReleaseMode && !kIsWeb) {
registerSignalServiceExtension(
name: 'exit',
callback: _exitApplication,
if (!kReleaseMode) {
if (!kIsWeb) {
registerSignalServiceExtension(
name: 'exit',
callback: _exitApplication,
);
}
// These service extensions are used in profile mode applications.
registerStringServiceExtension(
name: 'connectedVmServiceUri',
getter: () async => connectedVmServiceUri ?? '',
setter: (String uri) async {
connectedVmServiceUri = uri;
},
);
registerStringServiceExtension(
name: 'activeDevToolsServerAddress',
getter: () async => activeDevToolsServerAddress ?? '',
setter: (String serverAddress) async {
activeDevToolsServerAddress = serverAddress;
},
);
}
......@@ -245,23 +262,6 @@ abstract class BindingBase {
};
},
);
registerStringServiceExtension(
name: 'connectedVmServiceUri',
getter: () async => connectedVmServiceUri ?? '',
setter: (String uri) async {
connectedVmServiceUri = uri;
},
);
registerStringServiceExtension(
name: 'activeDevToolsServerAddress',
getter: () async => activeDevToolsServerAddress ?? '',
setter: (String serverAddress) async {
activeDevToolsServerAddress = serverAddress;
},
);
return true;
}());
assert(() {
......
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