Skip to content

Commit d13cd88

Browse files
[flutter_tools] remove VmService screenshot for native devices. (#135462)
* This is completely broken on the Impeller renderer, see: flutter/flutter#135052 * Even on the Skia renderer, this gives a software rasterized screenshot which will absolutely look different from a native rendering screenshot. I plan to remove this functionality from the engine.
1 parent e5d3b70 commit d13cd88

File tree

6 files changed

+10
-144
lines changed

6 files changed

+10
-144
lines changed

packages/flutter_tools/lib/src/commands/screenshot.dart

Lines changed: 2 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ const String _kType = 'type';
1818
const String _kVmServiceUrl = 'vm-service-url';
1919
const String _kDeviceType = 'device';
2020
const String _kSkiaType = 'skia';
21-
const String _kRasterizerType = 'rasterizer';
2221

2322
class ScreenshotCommand extends FlutterCommand {
2423
ScreenshotCommand({required this.fs}) {
@@ -33,21 +32,20 @@ class ScreenshotCommand extends FlutterCommand {
3332
aliases: <String>[ 'observatory-url' ], // for historical reasons
3433
valueHelp: 'URI',
3534
help: 'The VM Service URL to which to connect.\n'
36-
'This is required when "--$_kType" is "$_kSkiaType" or "$_kRasterizerType".\n'
35+
'This is required when "--$_kType" is "$_kSkiaType".\n'
3736
'To find the VM service URL, use "flutter run" and look for '
3837
'"A Dart VM Service ... is available at" in the output.',
3938
);
4039
argParser.addOption(
4140
_kType,
4241
valueHelp: 'type',
4342
help: 'The type of screenshot to retrieve.',
44-
allowed: const <String>[_kDeviceType, _kSkiaType, _kRasterizerType],
43+
allowed: const <String>[_kDeviceType, _kSkiaType],
4544
allowedHelp: const <String, String>{
4645
_kDeviceType: "Delegate to the device's native screenshot capabilities. This "
4746
'screenshots the entire screen currently being displayed (including content '
4847
'not rendered by Flutter, like the device status bar).',
4948
_kSkiaType: 'Render the Flutter app as a Skia picture. Requires "--$_kVmServiceUrl".',
50-
_kRasterizerType: 'Render the Flutter app using the rasterizer. Requires "--$_kVmServiceUrl."',
5149
},
5250
defaultsTo: _kDeviceType,
5351
);
@@ -116,8 +114,6 @@ class ScreenshotCommand extends FlutterCommand {
116114
await runScreenshot(outputFile);
117115
case _kSkiaType:
118116
success = await runSkia(outputFile);
119-
case _kRasterizerType:
120-
success = await runRasterizer(outputFile);
121117
}
122118

123119
return success ? FlutterCommandResult.success()
@@ -173,30 +169,6 @@ class ScreenshotCommand extends FlutterCommand {
173169
return true;
174170
}
175171

176-
Future<bool> runRasterizer(File? outputFile) async {
177-
final Uri vmServiceUrl = Uri.parse(stringArg(_kVmServiceUrl)!);
178-
final FlutterVmService vmService = await connectToVmService(vmServiceUrl, logger: globals.logger);
179-
final vm_service.Response? response = await vmService.screenshot();
180-
if (response == null) {
181-
globals.printError(
182-
'The screenshot request failed, probably because the device was '
183-
'disconnected',
184-
);
185-
return false;
186-
}
187-
outputFile ??= globals.fsUtils.getUniqueFile(
188-
fs.currentDirectory,
189-
'flutter',
190-
'png',
191-
);
192-
final IOSink sink = outputFile.openWrite();
193-
sink.add(base64.decode(response.json?['screenshot'] as String));
194-
await sink.close();
195-
_showOutputFileInfo(outputFile);
196-
ensureOutputIsNotJsonRpcError(outputFile);
197-
return true;
198-
}
199-
200172
static void checkOutput(File outputFile, FileSystem fs) {
201173
if (!fs.file(outputFile.path).existsSync()) {
202174
throwToolExit(

packages/flutter_tools/lib/src/resident_runner.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1017,17 +1017,17 @@ abstract class ResidentHandlers {
10171017
}
10181018

10191019
Future<bool> _takeVmServiceScreenshot(FlutterDevice device, File outputFile) async {
1020-
final bool isWebDevice = device.targetPlatform == TargetPlatform.web_javascript;
1020+
if (device.targetPlatform != TargetPlatform.web_javascript) {
1021+
return false;
1022+
}
10211023
assert(supportsServiceProtocol);
10221024

10231025
return _toggleDebugBanner(device, () async {
1024-
final vm_service.Response? response = isWebDevice
1025-
? await device.vmService!.callMethodWrapper('ext.dwds.screenshot')
1026-
: await device.vmService!.screenshot();
1026+
final vm_service.Response? response = await device.vmService!.callMethodWrapper('ext.dwds.screenshot');
10271027
if (response == null) {
10281028
throw Exception('Failed to take screenshot');
10291029
}
1030-
final String data = response.json![isWebDevice ? 'data' : 'screenshot'] as String;
1030+
final String data = response.json!['data'] as String;
10311031
outputFile.writeAsBytesSync(base64.decode(data));
10321032
});
10331033
}

packages/flutter_tools/lib/src/vmservice.dart

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ const String kFlushUIThreadTasksMethod = '_flutter.flushUIThreadTasks';
2828
const String kRunInViewMethod = '_flutter.runInView';
2929
const String kListViewsMethod = '_flutter.listViews';
3030
const String kScreenshotSkpMethod = '_flutter.screenshotSkp';
31-
const String kScreenshotMethod = '_flutter.screenshot';
3231
const String kRenderFrameWithRasterStatsMethod = '_flutter.renderFrameWithRasterStats';
3332
const String kReloadAssetFonts = '_flutter.reloadAssetFonts';
3433

@@ -1054,10 +1053,6 @@ class FlutterVmService {
10541053
);
10551054
}
10561055

1057-
Future<vm_service.Response?> screenshot() {
1058-
return _checkedCallServiceExtension(kScreenshotMethod);
1059-
}
1060-
10611056
Future<vm_service.Response?> screenshotSkp() {
10621057
return _checkedCallServiceExtension(kScreenshotSkpMethod);
10631058
}

packages/flutter_tools/test/commands.shard/hermetic/screenshot_command_test.dart

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,6 @@ void main() {
3131
.run(<String>['screenshot', '--type=skia', '--vm-service-url=http://localhost:8181']),
3232
throwsA(isException.having((Exception exception) => exception.toString(), 'message', contains('dummy'))),
3333
);
34-
35-
await expectLater(() => createTestCommandRunner(ScreenshotCommand(fs: MemoryFileSystem.test()))
36-
.run(<String>['screenshot', '--type=rasterizer', '--vm-service-url=http://localhost:8181']),
37-
throwsA(isException.having((Exception exception) => exception.toString(), 'message', contains('dummy'))),
38-
);
3934
});
4035

4136

@@ -44,11 +39,6 @@ void main() {
4439
.run(<String>['screenshot', '--type=skia']),
4540
throwsToolExit(message: 'VM Service URI must be specified for screenshot type skia')
4641
);
47-
48-
await expectLater(() => createTestCommandRunner(ScreenshotCommand(fs: MemoryFileSystem.test()))
49-
.run(<String>['screenshot', '--type=rasterizer',]),
50-
throwsToolExit(message: 'VM Service URI must be specified for screenshot type rasterizer'),
51-
);
5242
});
5343

5444
testUsingContext('device screenshots require device', () async {

packages/flutter_tools/test/general.shard/terminal_handler_test.dart

Lines changed: 3 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -1015,38 +1015,14 @@ void main() {
10151015
expect(logger.statusText, contains('Screenshot written to flutter_01.png (0kB)'));
10161016
});
10171017

1018-
testWithoutContext('s, can take screenshot on debug device that does not support screenshot', () async {
1018+
testWithoutContext('s, will not take screenshot on non-web device without screenshot tooling support', () async {
10191019
final BufferLogger logger = BufferLogger.test();
10201020
final FileSystem fileSystem = MemoryFileSystem.test();
1021-
final TerminalHandler terminalHandler = setUpTerminalHandler(<FakeVmServiceRequest>[
1022-
listViews,
1023-
FakeVmServiceRequest(
1024-
method: 'ext.flutter.debugAllowBanner',
1025-
args: <String, Object?>{
1026-
'isolateId': fakeUnpausedIsolate.id,
1027-
'enabled': 'false',
1028-
},
1029-
),
1030-
FakeVmServiceRequest(
1031-
method: '_flutter.screenshot',
1032-
args: <String, Object>{},
1033-
jsonResponse: <String, Object>{
1034-
'screenshot': base64.encode(<int>[1, 2, 3, 4]),
1035-
},
1036-
),
1037-
FakeVmServiceRequest(
1038-
method: 'ext.flutter.debugAllowBanner',
1039-
args: <String, Object?>{
1040-
'isolateId': fakeUnpausedIsolate.id,
1041-
'enabled': 'true',
1042-
},
1043-
),
1044-
], logger: logger, fileSystem: fileSystem);
1021+
final TerminalHandler terminalHandler = setUpTerminalHandler(<FakeVmServiceRequest>[], logger: logger, fileSystem: fileSystem);
10451022

10461023
await terminalHandler.processTerminalInput('s');
10471024

1048-
expect(logger.statusText, contains('Screenshot written to flutter_01.png (0kB)'));
1049-
expect(fileSystem.currentDirectory.childFile('flutter_01.png').readAsBytesSync(), <int>[1, 2, 3, 4]);
1025+
expect(logger.statusText, isNot(contains('Screenshot written to')));
10501026
});
10511027

10521028
testWithoutContext('s, can take screenshot on debug web device that does not support screenshot', () async {
@@ -1133,66 +1109,6 @@ void main() {
11331109
expect(fileSystem.currentDirectory.childFile('flutter_01.png'), isNot(exists));
11341110
});
11351111

1136-
testWithoutContext('s, bails taking screenshot on debug device if debugAllowBanner throws RpcError', () async {
1137-
final BufferLogger logger = BufferLogger.test();
1138-
final FileSystem fileSystem = MemoryFileSystem.test();
1139-
final TerminalHandler terminalHandler = setUpTerminalHandler(
1140-
<FakeVmServiceRequest>[
1141-
listViews,
1142-
FakeVmServiceRequest(
1143-
method: 'ext.flutter.debugAllowBanner',
1144-
args: <String, Object?>{
1145-
'isolateId': fakeUnpausedIsolate.id,
1146-
'enabled': 'false',
1147-
},
1148-
// Failed response,
1149-
errorCode: RPCErrorCodes.kInternalError,
1150-
),
1151-
],
1152-
logger: logger,
1153-
fileSystem: fileSystem,
1154-
);
1155-
1156-
await terminalHandler.processTerminalInput('s');
1157-
1158-
expect(logger.errorText, contains('Error'));
1159-
});
1160-
1161-
testWithoutContext('s, bails taking screenshot on debug device if flutter.screenshot throws RpcError, restoring banner', () async {
1162-
final BufferLogger logger = BufferLogger.test();
1163-
final FileSystem fileSystem = MemoryFileSystem.test();
1164-
final TerminalHandler terminalHandler = setUpTerminalHandler(
1165-
<FakeVmServiceRequest>[
1166-
listViews,
1167-
FakeVmServiceRequest(
1168-
method: 'ext.flutter.debugAllowBanner',
1169-
args: <String, Object?>{
1170-
'isolateId': fakeUnpausedIsolate.id,
1171-
'enabled': 'false',
1172-
},
1173-
),
1174-
const FakeVmServiceRequest(
1175-
method: '_flutter.screenshot',
1176-
// Failed response,
1177-
errorCode: RPCErrorCodes.kInternalError,
1178-
),
1179-
FakeVmServiceRequest(
1180-
method: 'ext.flutter.debugAllowBanner',
1181-
args: <String, Object?>{
1182-
'isolateId': fakeUnpausedIsolate.id,
1183-
'enabled': 'true',
1184-
},
1185-
),
1186-
],
1187-
logger: logger,
1188-
fileSystem: fileSystem,
1189-
);
1190-
1191-
await terminalHandler.processTerminalInput('s');
1192-
1193-
expect(logger.errorText, contains('Error'));
1194-
});
1195-
11961112
testWithoutContext('s, bails taking screenshot on debug device if dwds.screenshot throws RpcError, restoring banner', () async {
11971113
final BufferLogger logger = BufferLogger.test();
11981114
final FileSystem fileSystem = MemoryFileSystem.test();

packages/flutter_tools/test/general.shard/vmservice_test.dart

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -442,10 +442,6 @@ void main() {
442442
method: kListViewsMethod,
443443
errorCode: RPCErrorCodes.kServiceDisappeared,
444444
),
445-
const FakeVmServiceRequest(
446-
method: kScreenshotMethod,
447-
errorCode: RPCErrorCodes.kServiceDisappeared,
448-
),
449445
const FakeVmServiceRequest(
450446
method: kScreenshotSkpMethod,
451447
errorCode: RPCErrorCodes.kServiceDisappeared,
@@ -480,9 +476,6 @@ void main() {
480476
final List<FlutterView> views = await fakeVmServiceHost.vmService.getFlutterViews();
481477
expect(views, isEmpty);
482478

483-
final vm_service.Response? screenshot = await fakeVmServiceHost.vmService.screenshot();
484-
expect(screenshot, isNull);
485-
486479
final vm_service.Response? screenshotSkp = await fakeVmServiceHost.vmService.screenshotSkp();
487480
expect(screenshotSkp, isNull);
488481

0 commit comments

Comments
 (0)