From 475ee89879834fc3d79da5f3250bd88e91f19ef8 Mon Sep 17 00:00:00 2001 From: Emmanuel Garcia Date: Wed, 27 Nov 2019 17:52:36 -0800 Subject: [PATCH] Make Android log reader read any recent logs (#45743) --- .../lib/src/android/android_device.dart | 7 +++-- .../android/android_device_test.dart | 29 +++++++++++++++++++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/packages/flutter_tools/lib/src/android/android_device.dart b/packages/flutter_tools/lib/src/android/android_device.dart index d711a103007..30bcfc0576f 100644 --- a/packages/flutter_tools/lib/src/android/android_device.dart +++ b/packages/flutter_tools/lib/src/android/android_device.dart @@ -688,7 +688,7 @@ class AndroidDevice extends Device { String output; try { output = runAdbCheckedSync([ - 'shell', '-x', 'logcat', '-v', 'time', '-t', '1', + 'shell', '-x', 'logcat', '-v', 'time', '-t', '1' ]); } catch (error) { printError('Failed to extract the most recent timestamp from the Android log: $error.'); @@ -1007,8 +1007,9 @@ class _AdbLogReader extends DeviceLogReader { String get name => device.name; void _start() { - // Start the adb logcat process and filter logs by the "flutter" tag. - final List args = ['shell', '-x', 'logcat', '-v', 'time', '-s', 'flutter']; + final String lastTimestamp = device.lastLogcatTimestamp; + // Start the adb logcat process and filter the most recent logs since `lastTimestamp`. + final List args = ['logcat', '-v', 'time', '-T', lastTimestamp]; processUtils.start(device.adbCommandForDevice(args)).then((Process process) { _process = process; // We expect logcat streams to occasionally contain invalid utf-8, diff --git a/packages/flutter_tools/test/general.shard/android/android_device_test.dart b/packages/flutter_tools/test/general.shard/android/android_device_test.dart index a0e66d6c930..c8b9c66066f 100644 --- a/packages/flutter_tools/test/general.shard/android/android_device_test.dart +++ b/packages/flutter_tools/test/general.shard/android/android_device_test.dart @@ -680,6 +680,35 @@ flutter: }); }); + group('logReader', () { + ProcessManager mockProcessManager; + AndroidSdk mockAndroidSdk; + + setUp(() { + mockAndroidSdk = MockAndroidSdk(); + mockProcessManager = MockProcessManager(); + }); + + testUsingContext('calls adb logcat with expected flags', () async { + const String klastLocatcatTimestamp = '11-27 15:39:04.506'; + when(mockAndroidSdk.adbPath).thenReturn('adb'); + when(mockProcessManager.runSync(['adb', '-s', '1234', 'shell', '-x', 'logcat', '-v', 'time', '-t', '1'])) + .thenReturn(ProcessResult(0, 0, '$klastLocatcatTimestamp I/flutter: irrelevant', '')); + when(mockProcessManager.start(argThat(contains('logcat')))) + .thenAnswer((_) => Future.value(createMockProcess())); + + final AndroidDevice device = AndroidDevice('1234'); + final DeviceLogReader logReader = device.getLogReader(); + logReader.logLines.listen((_) {}); + + verify(mockProcessManager.start(const ['adb', '-s', '1234', 'logcat', '-v', 'time', '-T', klastLocatcatTimestamp])) + .called(1); + }, overrides: { + AndroidSdk: () => mockAndroidSdk, + ProcessManager: () => mockProcessManager, + }); + }); + test('Can parse adb shell dumpsys info', () { const String exampleOutput = r''' Applications Memory Usage (in Kilobytes):