Skip to content

Commit

Permalink
[flutter_tools] macOS cleanups, attach to log reader in release mode (f…
Browse files Browse the repository at this point in the history
  • Loading branch information
jonahwilliams authored Jul 23, 2020
1 parent 93ca301 commit 9f04086
Show file tree
Hide file tree
Showing 10 changed files with 363 additions and 191 deletions.
9 changes: 8 additions & 1 deletion packages/flutter_tools/lib/src/context_runner.dart
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,10 @@ Future<T> runInContext<T>(
config: globals.config,
fuchsiaWorkflow: fuchsiaWorkflow,
xcDevice: globals.xcdevice,
macOSWorkflow: MacOSWorkflow(
platform: globals.platform,
featureFlags: featureFlags,
),
),
Doctor: () => Doctor(logger: globals.logger),
DoctorValidatorsProvider: () => DoctorValidatorsProvider.defaultInstance,
Expand Down Expand Up @@ -193,7 +197,10 @@ Future<T> runInContext<T>(
outputPreferences: globals.outputPreferences,
timeoutConfiguration: timeoutConfiguration,
),
MacOSWorkflow: () => const MacOSWorkflow(),
MacOSWorkflow: () => MacOSWorkflow(
featureFlags: featureFlags,
platform: globals.platform,
),
MDnsObservatoryDiscovery: () => MDnsObservatoryDiscovery(),
OperatingSystemUtils: () => OperatingSystemUtils(
fileSystem: globals.fs,
Expand Down
40 changes: 24 additions & 16 deletions packages/flutter_tools/lib/src/desktop_device.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,12 @@
import 'dart:async';

import 'package:meta/meta.dart';
import 'package:process/process.dart';

import 'application_package.dart';
import 'base/common.dart';
import 'base/io.dart';
import 'base/logger.dart';
import 'build_info.dart';
import 'convert.dart';
import 'device.dart';
Expand All @@ -18,15 +20,23 @@ import 'protocol_discovery.dart';
/// A partial implementation of Device for desktop-class devices to inherit
/// from, containing implementations that are common to all desktop devices.
abstract class DesktopDevice extends Device {
DesktopDevice(String identifier, {@required PlatformType platformType, @required bool ephemeral}) : super(
identifier,
category: Category.desktop,
platformType: platformType,
ephemeral: ephemeral,
);

DesktopDevice(String identifier, {
@required PlatformType platformType,
@required bool ephemeral,
Logger logger,
ProcessManager processManager,
}) : _logger = logger ?? globals.logger, // TODO(jonahwilliams): remove after updating google3
_processManager = processManager ?? globals.processManager,
super(
identifier,
category: Category.desktop,
platformType: platformType,
ephemeral: ephemeral,
);

final Logger _logger;
final ProcessManager _processManager;
final Set<Process> _runningProcesses = <Process>{};

final DesktopLogReader _deviceLogReader = DesktopLogReader();

// Since the host and target devices are the same, no work needs to be done
Expand Down Expand Up @@ -108,20 +118,20 @@ abstract class DesktopDevice extends Device {
final BuildMode buildMode = debuggingOptions?.buildInfo?.mode;
final String executable = executablePathForDevice(package, buildMode);
if (executable == null) {
globals.printError('Unable to find executable to run');
_logger.printError('Unable to find executable to run');
return LaunchResult.failed();
}

final Process process = await globals.processManager.start(<String>[
final Process process = await _processManager.start(<String>[
executable,
]);
_runningProcesses.add(process);
unawaited(process.exitCode.then((_) => _runningProcesses.remove(process)));

_deviceLogReader.initializeProcess(process);
if (debuggingOptions?.buildInfo?.isRelease == true) {
return LaunchResult.succeeded();
}
_deviceLogReader.initializeProcess(process);
final ProtocolDiscovery observatoryDiscovery = ProtocolDiscovery.observatory(_deviceLogReader,
devicePort: debuggingOptions?.deviceVmServicePort,
hostPort: debuggingOptions?.hostVmServicePort,
Expand All @@ -133,12 +143,12 @@ abstract class DesktopDevice extends Device {
onAttached(package, buildMode, process);
return LaunchResult.succeeded(observatoryUri: observatoryUri);
}
globals.printError(
_logger.printError(
'Error waiting for a debug connection: '
'The log reader stopped unexpectedly.',
);
} on Exception catch (error) {
globals.printError('Error waiting for a debug connection: $error');
_logger.printError('Error waiting for a debug connection: $error');
} finally {
await observatoryDiscovery.cancel();
}
Expand Down Expand Up @@ -186,9 +196,7 @@ class DesktopLogReader extends DeviceLogReader {
void initializeProcess(Process process) {
process.stdout.listen(_inputController.add);
process.stderr.listen(_inputController.add);
process.exitCode.then((int result) {
_inputController.close();
});
process.exitCode.whenComplete(_inputController.close);
}

@override
Expand Down
11 changes: 10 additions & 1 deletion packages/flutter_tools/lib/src/device.dart
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import 'ios/ios_workflow.dart';
import 'ios/simulators.dart';
import 'linux/linux_device.dart';
import 'macos/macos_device.dart';
import 'macos/macos_workflow.dart';
import 'macos/xcode.dart';
import 'project.dart';
import 'tester/flutter_tester.dart';
Expand Down Expand Up @@ -292,6 +293,7 @@ class FlutterDeviceManager extends DeviceManager {
@required FlutterVersion flutterVersion,
@required Config config,
@required Artifacts artifacts,
@required MacOSWorkflow macOSWorkflow,
}) : deviceDiscoverers = <DeviceDiscovery>[
AndroidDevices(
logger: logger,
Expand Down Expand Up @@ -322,10 +324,17 @@ class FlutterDeviceManager extends DeviceManager {
logger: logger,
artifacts: artifacts,
),
MacOSDevices(),
MacOSDevices(
processManager: processManager,
macOSWorkflow: macOSWorkflow,
logger: logger,
platform: platform,
),
LinuxDevices(
platform: platform,
featureFlags: featureFlags,
processManager: processManager,
logger: logger,
),
WindowsDevices(),
WebDevices(
Expand Down
5 changes: 5 additions & 0 deletions packages/flutter_tools/lib/src/doctor.dart
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,11 @@ class _DefaultDoctorValidatorsProvider implements DoctorValidatorsProvider {
featureFlags: featureFlags,
);

final MacOSWorkflow macOSWorkflow = MacOSWorkflow(
platform: globals.platform,
featureFlags: featureFlags,
);

@override
List<DoctorValidator> get validators {
if (_validators != null) {
Expand Down
23 changes: 20 additions & 3 deletions packages/flutter_tools/lib/src/linux/linux_device.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,31 @@
// found in the LICENSE file.

import 'package:meta/meta.dart';
import 'package:process/process.dart';

import '../base/logger.dart';
import '../base/platform.dart';
import '../build_info.dart';
import '../desktop_device.dart';
import '../device.dart';
import '../features.dart';
import '../globals.dart' as globals;
import '../project.dart';
import 'application_package.dart';
import 'build_linux.dart';
import 'linux_workflow.dart';

/// A device that represents a desktop Linux target.
class LinuxDevice extends DesktopDevice {
LinuxDevice() : super(
LinuxDevice({
@required ProcessManager processManager,
@required Logger logger,
}) : super(
'linux',
platformType: PlatformType.linux,
ephemeral: false,
logger: logger,
processManager: processManager,
);

@override
Expand Down Expand Up @@ -59,15 +67,21 @@ class LinuxDevices extends PollingDeviceDiscovery {
LinuxDevices({
@required Platform platform,
@required FeatureFlags featureFlags,
}) : _platform = platform,
ProcessManager processManager,
Logger logger,
}) : _platform = platform ?? globals.platform, // TODO(jonahwilliams): remove after google3 roll
_linuxWorkflow = LinuxWorkflow(
platform: platform,
featureFlags: featureFlags,
),
_logger = logger,
_processManager = processManager ?? globals.processManager,
super('linux devices');

final Platform _platform;
final LinuxWorkflow _linuxWorkflow;
final ProcessManager _processManager;
final Logger _logger;

@override
bool get supportsPlatform => _platform.isLinux;
Expand All @@ -81,7 +95,10 @@ class LinuxDevices extends PollingDeviceDiscovery {
return const <Device>[];
}
return <Device>[
LinuxDevice(),
LinuxDevice(
logger: _logger,
processManager: _processManager,
),
];
}

Expand Down
52 changes: 40 additions & 12 deletions packages/flutter_tools/lib/src/macos/macos_device.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,37 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:meta/meta.dart';
import 'package:process/process.dart';

import '../base/io.dart';
import '../base/logger.dart';
import '../base/platform.dart';
import '../build_info.dart';
import '../desktop_device.dart';
import '../device.dart';
import '../globals.dart' as globals;
import '../macos/application_package.dart';
import '../project.dart';
import 'build_macos.dart';
import 'macos_workflow.dart';

/// A device that represents a desktop MacOS target.
class MacOSDevice extends DesktopDevice {
MacOSDevice() : super(
'macos',
platformType: PlatformType.macos,
ephemeral: false,
);
MacOSDevice({
@required ProcessManager processManager,
@required Logger logger,
}) : _processManager = processManager,
_logger = logger,
super(
'macos',
platformType: PlatformType.macos,
ephemeral: false,
processManager: processManager,
logger: logger,
);

final ProcessManager _processManager;
final Logger _logger;

@override
bool isSupported() => true;
Expand All @@ -44,7 +58,7 @@ class MacOSDevice extends DesktopDevice {
flutterProject: FlutterProject.current(),
buildInfo: buildInfo,
targetOverride: mainPath,
verboseLogging: globals.logger.isVerbose,
verboseLogging: _logger.isVerbose,
);
}

Expand All @@ -59,7 +73,7 @@ class MacOSDevice extends DesktopDevice {
// than post-attach, since this won't run for release builds, but there's
// no general-purpose way of knowing when a process is far enoug along in
// the launch process for 'open' to foreground it.
globals.processManager.run(<String>[
_processManager.run(<String>[
'open', package.applicationBundle(buildMode),
]).then((ProcessResult result) {
if (result.exitCode != 0) {
Expand All @@ -70,21 +84,35 @@ class MacOSDevice extends DesktopDevice {
}

class MacOSDevices extends PollingDeviceDiscovery {
MacOSDevices() : super('macOS devices');
MacOSDevices({
@required Platform platform,
@required MacOSWorkflow macOSWorkflow,
@required ProcessManager processManager,
@required Logger logger,
}) : _logger = logger,
_platform = platform,
_macOSWorkflow = macOSWorkflow,
_processManager = processManager,
super('macOS devices');

final MacOSWorkflow _macOSWorkflow;
final Platform _platform;
final ProcessManager _processManager;
final Logger _logger;

@override
bool get supportsPlatform => globals.platform.isMacOS;
bool get supportsPlatform => _platform.isMacOS;

@override
bool get canListAnything => macOSWorkflow.canListDevices;
bool get canListAnything => _macOSWorkflow.canListDevices;

@override
Future<List<Device>> pollingGetDevices({ Duration timeout }) async {
if (!canListAnything) {
return const <Device>[];
}
return <Device>[
MacOSDevice(),
MacOSDevice(processManager: _processManager, logger: _logger),
];
}

Expand Down
22 changes: 14 additions & 8 deletions packages/flutter_tools/lib/src/macos/macos_workflow.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,29 +2,35 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import '../base/context.dart';
import 'package:meta/meta.dart';

import '../base/platform.dart';
import '../doctor.dart';
import '../features.dart';
import '../globals.dart' as globals;

/// The [MacOSWorkflow] instance.
MacOSWorkflow get macOSWorkflow => context.get<MacOSWorkflow>();

/// The macOS-specific implementation of a [Workflow].
///
/// This workflow requires the flutter-desktop-embedding as a sibling
/// repository to the flutter repo.
class MacOSWorkflow implements Workflow {
const MacOSWorkflow();
const MacOSWorkflow({
@required Platform platform,
@required FeatureFlags featureFlags,
}) : _platform = platform,
_featureFlags = featureFlags;

final Platform _platform;
final FeatureFlags _featureFlags;

@override
bool get appliesToHostPlatform => globals.platform.isMacOS && featureFlags.isMacOSEnabled;
bool get appliesToHostPlatform => _platform.isMacOS && _featureFlags.isMacOSEnabled;

@override
bool get canLaunchDevices => globals.platform.isMacOS && featureFlags.isMacOSEnabled;
bool get canLaunchDevices => _platform.isMacOS && _featureFlags.isMacOSEnabled;

@override
bool get canListDevices => globals.platform.isMacOS && featureFlags.isMacOSEnabled;
bool get canListDevices => _platform.isMacOS && _featureFlags.isMacOSEnabled;

@override
bool get canListEmulators => false;
Expand Down
Loading

0 comments on commit 9f04086

Please sign in to comment.