diff --git a/packages/flutter_tools/lib/src/android/android_device.dart b/packages/flutter_tools/lib/src/android/android_device.dart index f909666f27e..45c5e21113e 100644 --- a/packages/flutter_tools/lib/src/android/android_device.dart +++ b/packages/flutter_tools/lib/src/android/android_device.dart @@ -307,7 +307,7 @@ class AndroidDevice extends Device { TargetPlatform get platform => TargetPlatform.android; void clearLogs() { - runSync(adbCommandForDevice(['logcat', '-c'])); + runSync(adbCommandForDevice(['-s', id, 'logcat', '-c'])); } DeviceLogReader createLogReader() => new _AdbLogReader(this); @@ -322,10 +322,12 @@ class AndroidDevice extends Device { ])); } - // Return the most recent timestamp in the Android log. The format can be + // Return the most recent timestamp in the Android log. The format can be // passed to logcat's -T option. String lastLogcatTimestamp() { - String output = runCheckedSync(adbCommandForDevice(['logcat', '-v', 'time', '-t', '1'])); + String output = runCheckedSync(adbCommandForDevice([ + '-s', id, 'logcat', '-v', 'time', '-t', '1' + ])); RegExp timeRegExp = new RegExp(r'^\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3}', multiLine: true); Match timeMatch = timeRegExp.firstMatch(output); @@ -350,7 +352,9 @@ class AndroidDevice extends Device { String tracePath = null; bool isComplete = false; while (!isComplete) { - String logs = runCheckedSync(adbCommandForDevice(['logcat', '-d', '-T', beforeStop])); + String logs = runCheckedSync(adbCommandForDevice([ + '-s', id, 'logcat', '-d', '-T', beforeStop + ])); Match fileMatch = traceRegExp.firstMatch(logs); if (fileMatch != null && fileMatch[1] != null) { tracePath = fileMatch[1]; @@ -484,16 +488,15 @@ List getAdbDevices() { return devices; } -/// A log reader that logs from `adb logcat`. This will have the same output as -/// another copy of [_AdbLogReader], and the two instances will be equivalent. +/// A log reader that logs from `adb logcat`. class _AdbLogReader extends DeviceLogReader { _AdbLogReader(this.device); final AndroidDevice device; - String get name => 'Android'; + String get name => device.name; - Future logs({bool clear: false}) async { + Future logs({ bool clear: false, bool showPrefix: false }) async { if (!device.isConnected()) return 2; @@ -501,6 +504,8 @@ class _AdbLogReader extends DeviceLogReader { device.clearLogs(); return await runCommandAndStreamOutput(device.adbCommandForDevice([ + '-s', + device.id, 'logcat', '-v', 'tag', // Only log the tag and the message @@ -509,15 +514,16 @@ class _AdbLogReader extends DeviceLogReader { 'ActivityManager:W', 'System.err:W', '*:F', - ]), prefix: '[Android] '); + ]), prefix: showPrefix ? '[$name] ' : ''); } - // Intentionally constant; overridden because we've overridden the `operator ==` method below. int get hashCode => name.hashCode; bool operator ==(dynamic other) { if (identical(this, other)) return true; - return other is _AdbLogReader; + if (other is! _AdbLogReader) + return false; + return other.device.id == device.id; } } diff --git a/packages/flutter_tools/lib/src/commands/logs.dart b/packages/flutter_tools/lib/src/commands/logs.dart index 06d662295c2..696e3d20f2e 100644 --- a/packages/flutter_tools/lib/src/commands/logs.dart +++ b/packages/flutter_tools/lib/src/commands/logs.dart @@ -35,15 +35,15 @@ class LogsCommand extends FlutterCommand { bool clear = argResults['clear']; - Set readers = new Set(); + List readers = new List(); for (Device device in devices) { readers.add(device.createLogReader()); } - printStatus('Showing logs for ${readers.join(', ')}:'); + printStatus('Showing ${readers.join(', ')} logs:'); List results = await Future.wait(readers.map((DeviceLogReader reader) async { - int result = await reader.logs(clear: clear); + int result = await reader.logs(clear: clear, showPrefix: devices.length > 1); if (result != 0) printError('Error listening to $reader logs.'); return result; diff --git a/packages/flutter_tools/lib/src/device.dart b/packages/flutter_tools/lib/src/device.dart index df00d2b7c64..8ad0635d5a3 100644 --- a/packages/flutter_tools/lib/src/device.dart +++ b/packages/flutter_tools/lib/src/device.dart @@ -189,7 +189,7 @@ abstract class Device { abstract class DeviceLogReader { String get name; - Future logs({ bool clear: false }); + Future logs({ bool clear: false, bool showPrefix: false }); int get hashCode; bool operator ==(dynamic other); diff --git a/packages/flutter_tools/lib/src/ios/devices.dart b/packages/flutter_tools/lib/src/ios/devices.dart index b5900f07d93..cf1a55a7b6f 100644 --- a/packages/flutter_tools/lib/src/ios/devices.dart +++ b/packages/flutter_tools/lib/src/ios/devices.dart @@ -232,13 +232,13 @@ class _IOSDeviceLogReader extends DeviceLogReader { String get name => device.name; // TODO(devoncarew): Support [clear]. - Future logs({ bool clear: false }) async { + Future logs({ bool clear: false, bool showPrefix: false }) async { if (!device.isConnected()) return 2; return await runCommandAndStreamOutput( [device.loggerPath], - prefix: '[$name] ', + prefix: showPrefix ? '[$name] ' : '', filter: new RegExp(r'Runner') ); } diff --git a/packages/flutter_tools/lib/src/ios/simulators.dart b/packages/flutter_tools/lib/src/ios/simulators.dart index 94809818637..b157a25c415 100644 --- a/packages/flutter_tools/lib/src/ios/simulators.dart +++ b/packages/flutter_tools/lib/src/ios/simulators.dart @@ -410,7 +410,7 @@ class _IOSSimulatorLogReader extends DeviceLogReader { String get name => device.name; - Future logs({ bool clear: false }) async { + Future logs({ bool clear: false, bool showPrefix: false }) async { if (!device.isConnected()) return 2; @@ -432,7 +432,7 @@ class _IOSSimulatorLogReader extends DeviceLogReader { Future result = runCommandAndStreamOutput( ['tail', '-n', '+0', '-F', device.logFilePath], - prefix: '[$name] ', + prefix: showPrefix ? '[$name] ' : '', mapFunction: (String string) { Match match = mapRegex.matchAsPrefix(string); if (match != null) { @@ -465,7 +465,7 @@ class _IOSSimulatorLogReader extends DeviceLogReader { // ReportCrash[37965]: Saved crash report for FlutterRunner[37941]... runCommandAndStreamOutput( ['tail', '-F', '/private/var/log/system.log'], - prefix: '[$name] ', + prefix: showPrefix ? '[$name] ' : '', filter: new RegExp(r' FlutterRunner\[\d+\] '), mapFunction: (String string) { Match match = mapRegex.matchAsPrefix(string);