diff --git a/AUTHORS b/AUTHORS index d11fe71721..c807cb99c2 100644 --- a/AUTHORS +++ b/AUTHORS @@ -77,3 +77,4 @@ Hidenori Matsubayashi Perqin Xie Seongyun Kim Ludwik Trammer +Marian Triebe diff --git a/packages/flutter_tools/lib/src/android/android_emulator.dart b/packages/flutter_tools/lib/src/android/android_emulator.dart index 47ac9357af..72e636ccb4 100644 --- a/packages/flutter_tools/lib/src/android/android_emulator.dart +++ b/packages/flutter_tools/lib/src/android/android_emulator.dart @@ -149,10 +149,15 @@ class AndroidEmulator extends Emulator { String _prop(String name) => _properties != null ? _properties[name] : null; @override - Future launch({@visibleForTesting Duration startupDuration}) async { - final Process process = await _processUtils.start( - [_androidSdk.emulatorPath, '-avd', id], - ); + Future launch({@visibleForTesting Duration startupDuration, bool coldBoot = false}) async { + final List command = [ + _androidSdk.emulatorPath, + '-avd', + id, + if (coldBoot) + '-no-snapshot-load' + ]; + final Process process = await _processUtils.start(command); // Record output from the emulator process. final List stdoutList = []; diff --git a/packages/flutter_tools/lib/src/commands/emulators.dart b/packages/flutter_tools/lib/src/commands/emulators.dart index fd8bbb0e8f..1f9ea1dcbf 100644 --- a/packages/flutter_tools/lib/src/commands/emulators.dart +++ b/packages/flutter_tools/lib/src/commands/emulators.dart @@ -15,6 +15,9 @@ class EmulatorsCommand extends FlutterCommand { EmulatorsCommand() { argParser.addOption('launch', help: 'The full or partial ID of the emulator to launch.'); + argParser.addFlag('cold', + help: 'Used with the "--launch" flag to cold boot the emulator instance (Android only).', + negatable: false); argParser.addFlag('create', help: 'Creates a new Android emulator based on a Pixel device.', negatable: false); @@ -43,7 +46,8 @@ class EmulatorsCommand extends FlutterCommand { } if (argResults.wasParsed('launch')) { - await _launchEmulator(stringArg('launch')); + final bool coldBoot = argResults.wasParsed('cold'); + await _launchEmulator(stringArg('launch'), coldBoot: coldBoot); } else if (argResults.wasParsed('create')) { await _createEmulator(name: stringArg('name')); } else { @@ -57,7 +61,7 @@ class EmulatorsCommand extends FlutterCommand { return FlutterCommandResult.success(); } - Future _launchEmulator(String id) async { + Future _launchEmulator(String id, {bool coldBoot}) async { final List emulators = await emulatorManager.getEmulatorsMatching(id); @@ -69,7 +73,7 @@ class EmulatorsCommand extends FlutterCommand { "More than one emulator matches '$id':", ); } else { - await emulators.first.launch(); + await emulators.first.launch(coldBoot: coldBoot); } } diff --git a/packages/flutter_tools/lib/src/emulator.dart b/packages/flutter_tools/lib/src/emulator.dart index e825ea2bbd..327a5f1ce3 100644 --- a/packages/flutter_tools/lib/src/emulator.dart +++ b/packages/flutter_tools/lib/src/emulator.dart @@ -268,7 +268,7 @@ abstract class Emulator { && other.id == id; } - Future launch(); + Future launch({bool coldBoot}); @override String toString() => name; diff --git a/packages/flutter_tools/lib/src/ios/ios_emulators.dart b/packages/flutter_tools/lib/src/ios/ios_emulators.dart index 7761d1a4bd..de9da80e3e 100644 --- a/packages/flutter_tools/lib/src/ios/ios_emulators.dart +++ b/packages/flutter_tools/lib/src/ios/ios_emulators.dart @@ -40,7 +40,7 @@ class IOSEmulator extends Emulator { PlatformType get platformType => PlatformType.ios; @override - Future launch() async { + Future launch({bool coldBoot = false}) async { Future launchSimulator(List additionalArgs) async { final List args = [ 'open', diff --git a/packages/flutter_tools/test/general.shard/android/android_emulator_test.dart b/packages/flutter_tools/test/general.shard/android/android_emulator_test.dart index ee5b74fd45..5718948831 100644 --- a/packages/flutter_tools/test/general.shard/android/android_emulator_test.dart +++ b/packages/flutter_tools/test/general.shard/android/android_emulator_test.dart @@ -144,6 +144,22 @@ void main() { await emulator.launch(startupDuration: Duration.zero); }); + testWithoutContext('succeeds with coldboot launch', () async { + final List kEmulatorLauchColdBootCommand = [ + ...kEmulatorLaunchCommand, + '-no-snapshot-load' + ]; + final AndroidEmulator emulator = AndroidEmulator(emulatorID, + processManager: FakeProcessManager.list([ + FakeCommand(command: kEmulatorLauchColdBootCommand), + ]), + androidSdk: mockSdk, + logger: BufferLogger.test(), + ); + + await emulator.launch(startupDuration: Duration.zero, coldBoot: true); + }); + testWithoutContext('prints error on failure', () async { final BufferLogger logger = BufferLogger.test(); final AndroidEmulator emulator = AndroidEmulator(emulatorID, diff --git a/packages/flutter_tools/test/general.shard/emulator_test.dart b/packages/flutter_tools/test/general.shard/emulator_test.dart index f596820517..2d17323601 100644 --- a/packages/flutter_tools/test/general.shard/emulator_test.dart +++ b/packages/flutter_tools/test/general.shard/emulator_test.dart @@ -367,7 +367,7 @@ class FakeEmulator extends Emulator { PlatformType get platformType => PlatformType.android; @override - Future launch() { + Future launch({bool coldBoot = false}) { throw UnimplementedError('Not implemented in Mock'); } }