diff --git a/packages/flutter_tools/lib/src/commands/fuchsia_reload.dart b/packages/flutter_tools/lib/src/commands/fuchsia_reload.dart index cafc0a6791f..6703dbc1242 100644 --- a/packages/flutter_tools/lib/src/commands/fuchsia_reload.dart +++ b/packages/flutter_tools/lib/src/commands/fuchsia_reload.dart @@ -8,7 +8,6 @@ import 'dart:collection'; import '../base/common.dart'; import '../base/file_system.dart'; import '../base/io.dart'; -import '../base/platform.dart'; import '../base/process_manager.dart'; import '../base/utils.dart'; import '../cache.dart'; @@ -35,22 +34,17 @@ class FuchsiaReloadCommand extends FlutterCommand { argParser.addOption('address', abbr: 'a', help: 'Fuchsia device network name or address.'); - argParser.addOption('build-type', + argParser.addOption('build-dir', abbr: 'b', - defaultsTo: 'release-x86-64', - help: 'Fuchsia build type, e.g. release-x86-64.'); - argParser.addOption('fuchsia-root', - abbr: 'f', - defaultsTo: platform.environment['FUCHSIA_ROOT'], - help: 'Path to Fuchsia source tree.'); + defaultsTo: null, + help: 'Fuchsia build directory, e.g. out/release-x86-64.'); argParser.addOption('gn-target', abbr: 'g', help: 'GN target of the application, e.g //path/to/app:app.'); argParser.addFlag('list', abbr: 'l', defaultsTo: false, - help: 'Lists the running modules. ' - 'Requires the flags --address(-a) and --fuchsia-root(-f).'); + help: 'Lists the running modules. '); argParser.addOption('name-override', abbr: 'n', help: 'On-device name of the application binary.'); @@ -71,8 +65,7 @@ class FuchsiaReloadCommand extends FlutterCommand { @override final String description = 'Hot reload on Fuchsia.'; - String _fuchsiaRoot; - String _buildType; + String _buildDir; String _projectRoot; String _projectName; String _binaryName; @@ -88,7 +81,7 @@ class FuchsiaReloadCommand extends FlutterCommand { Future runCommand() async { Cache.releaseLockEarly(); - _validateArguments(); + await _validateArguments(); // Find the network ports used on the device by VM service instances. final List deviceServicePorts = await _getServicePorts(); @@ -209,6 +202,7 @@ class FuchsiaReloadCommand extends FlutterCommand { String _vmServiceToString(VMService vmService, {int tabDepth: 0}) { final Uri addr = vmService.httpAddress; + final String embedder = vmService.vm.embedder; final int numIsolates = vmService.vm.isolates.length; final String maxRSS = getSizeAsMB(vmService.vm.maxRSS); final String heapSize = getSizeAsMB(vmService.vm.heapAllocatedMemoryUsage); @@ -233,7 +227,7 @@ class FuchsiaReloadCommand extends FlutterCommand { final String tabs = '\t' * tabDepth; final String extraTabs = '\t' * (tabDepth + 1); final StringBuffer stringBuffer = new StringBuffer( - '$tabs${_bold}VM at $addr$_reset\n' + '$tabs$_bold$embedder at $addr$_reset\n' '${extraTabs}RSS: $maxRSS\n' '${extraTabs}Native allocations: $heapSize\n' '${extraTabs}New Spaces: $newUsed of $newCap\n' @@ -290,21 +284,29 @@ class FuchsiaReloadCommand extends FlutterCommand { } } - void _validateArguments() { - _fuchsiaRoot = argResults['fuchsia-root']; - if (_fuchsiaRoot == null) - throwToolExit('Please give the location of the Fuchsia tree with --fuchsia-root.'); - if (!_directoryExists(_fuchsiaRoot)) - throwToolExit('Specified --fuchsia-root "$_fuchsiaRoot" does not exist.'); + Future _validateArguments() async { + _buildDir = argResults['build-dir']; + if (_buildDir == null) { + final ProcessResult result = await processManager.run(['fx', 'get-build-dir']); + if (result.exitCode == 0) + _buildDir = result.stdout.trim(); + else + printStatus('get-build-dir failed:\nstdout: ${result.stdout}\nstderr: ${result.stderr}'); + } + if (!_directoryExists(_buildDir)) + throwToolExit('Specified --build-dir "$_buildDir" does not exist.'); _address = argResults['address']; + if (_address == null) { + final ProcessResult result = await processManager.run(['fx', 'netaddr', '--fuchsia']); + if (result.exitCode == 0) + _address = result.stdout.trim(); + else + printStatus('netaddr failed:\nstdout: ${result.stdout}\nstderr: ${result.stderr}'); + } if (_address == null) throwToolExit('Give the address of the device running Fuchsia with --address.'); - _buildType = argResults['build-type']; - if (_buildType == null) - throwToolExit('Give the build type with --build-type.'); - _list = argResults['list']; if (_list) { // For --list, we only need the device address and the Fuchsia tree root. @@ -317,7 +319,7 @@ class FuchsiaReloadCommand extends FlutterCommand { final List targetInfo = _extractPathAndName(gnTarget); _projectRoot = targetInfo[0]; _projectName = targetInfo[1]; - _fuchsiaProjectPath = '$_fuchsiaRoot/$_projectRoot'; + _fuchsiaProjectPath = '$_buildDir/../../$_projectRoot'; if (!_directoryExists(_fuchsiaProjectPath)) throwToolExit('Target does not exist in the Fuchsia tree: $_fuchsiaProjectPath.'); @@ -329,7 +331,7 @@ class FuchsiaReloadCommand extends FlutterCommand { throwToolExit('Couldn\'t find application entry point at $_target.'); final String packagesFileName = '${_projectName}_dart_library.packages'; - _dotPackagesPath = '$_fuchsiaRoot/out/$_buildType/dartlang/gen/$_projectRoot/$packagesFileName'; + _dotPackagesPath = '$_buildDir/dartlang/gen/$_projectRoot/$packagesFileName'; if (!_fileExists(_dotPackagesPath)) throwToolExit('Couldn\'t find .packages file at $_dotPackagesPath.'); @@ -365,7 +367,7 @@ class FuchsiaReloadCommand extends FlutterCommand { } Future> _forwardPorts(List remotePorts) { - final String config = '$_fuchsiaRoot/out/$_buildType/ssh-keys/ssh_config'; + final String config = '$_buildDir/ssh-keys/ssh_config'; return Future.wait(remotePorts.map((int remotePort) { return _PortForwarder.start(config, _address, remotePort); })); @@ -373,17 +375,19 @@ class FuchsiaReloadCommand extends FlutterCommand { Future> _getServicePorts() async { final FuchsiaDeviceCommandRunner runner = - new FuchsiaDeviceCommandRunner(_address, _fuchsiaRoot, _buildType); + new FuchsiaDeviceCommandRunner(_address, _buildDir); final List lsOutput = await runner.run('ls /tmp/dart.services'); final List ports = []; - for (String s in lsOutput) { - final String trimmed = s.trim(); - final int lastSpace = trimmed.lastIndexOf(' '); - final String lastWord = trimmed.substring(lastSpace + 1); - if ((lastWord != '.') && (lastWord != '..')) { - final int value = int.parse(lastWord, onError: (_) => null); - if (value != null) - ports.add(value); + if (lsOutput != null) { + for (String s in lsOutput) { + final String trimmed = s.trim(); + final int lastSpace = trimmed.lastIndexOf(' '); + final String lastWord = trimmed.substring(lastSpace + 1); + if ((lastWord != '.') && (lastWord != '..')) { + final int value = int.parse(lastWord, onError: (_) => null); + if (value != null) + ports.add(value); + } } } return ports; @@ -473,16 +477,13 @@ class _PortForwarder { } class FuchsiaDeviceCommandRunner { - // TODO(zra): Get rid of _address and instead use - // $_fuchsiaRoot/out/build-magenta/tools/netaddr --fuchsia final String _address; - final String _buildType; - final String _fuchsiaRoot; + final String _buildDir; - FuchsiaDeviceCommandRunner(this._address, this._fuchsiaRoot, this._buildType); + FuchsiaDeviceCommandRunner(this._address, this._buildDir); Future> run(String command) async { - final String config = '$_fuchsiaRoot/out/$_buildType/ssh-keys/ssh_config'; + final String config = '$_buildDir/ssh-keys/ssh_config'; final List args = ['ssh', '-F', config, _address, command]; printTrace(args.join(' ')); final ProcessResult result = await processManager.run(args); diff --git a/packages/flutter_tools/lib/src/vmservice.dart b/packages/flutter_tools/lib/src/vmservice.dart index 8624be77496..a97ef680885 100644 --- a/packages/flutter_tools/lib/src/vmservice.dart +++ b/packages/flutter_tools/lib/src/vmservice.dart @@ -248,6 +248,8 @@ class VMService { } Future waitForViews({int attempts = 5, int attemptSeconds = 1}) async { + if (!vm.isFlutterEngine) + return; await vm.refreshViews(); for (int i = 0; (vm.firstView == null) && (i < attempts); i++) { // If the VM doesn't yet have a view, wait for one to show up. @@ -587,6 +589,7 @@ class VM extends ServiceObjectOwner { _heapAllocatedMemoryUsage = map['_heapAllocatedMemoryUsage']; } _maxRSS = map['_maxRSS']; + _embedder = map['_embedder']; // Remove any isolates which are now dead from the isolate cache. _removeDeadIsolates(map['isolates']); @@ -615,6 +618,12 @@ class VM extends ServiceObjectOwner { int _maxRSS; int get maxRSS => _maxRSS == null ? 0 : _maxRSS; + // The embedder's name, Flutter or dart_runner. + String _embedder; + String get embedder => _embedder; + bool get isFlutterEngine => embedder == 'Flutter'; + bool get isDartRunner => embedder == 'dart_runner'; + int _compareIsolates(Isolate a, Isolate b) { final DateTime aStart = a.startTime; final DateTime bStart = b.startTime; @@ -850,6 +859,8 @@ class VM extends ServiceObjectOwner { } Future refreshViews() async { + if (!isFlutterEngine) + return; _viewCache.clear(); await vmService.vm.invokeRpc('_flutter.listViews', timeout: kLongRequestTimeout); } diff --git a/packages/flutter_tools/test/commands/fuchsia_reload_test.dart b/packages/flutter_tools/test/commands/fuchsia_reload_test.dart index b182a7c9fae..2d0eef8e94a 100644 --- a/packages/flutter_tools/test/commands/fuchsia_reload_test.dart +++ b/packages/flutter_tools/test/commands/fuchsia_reload_test.dart @@ -18,8 +18,7 @@ void main() { testUsingContext('a test', () async { final FuchsiaDeviceCommandRunner commandRunner = new FuchsiaDeviceCommandRunner('8.8.9.9', - '~/fuchsia', - 'release-x86-64'); + '~/fuchsia/out/release-x86-64'); final List ports = await commandRunner.run('ls /tmp'); expect(ports, hasLength(3)); expect(ports[0], equals('1234'));