Print message when HttpException is thrown after running `flutter run` (#37440)
diff --git a/packages/flutter_tools/lib/src/resident_runner.dart b/packages/flutter_tools/lib/src/resident_runner.dart index 88ab5dc..cd618a3 100644 --- a/packages/flutter_tools/lib/src/resident_runner.dart +++ b/packages/flutter_tools/lib/src/resident_runner.dart
@@ -512,6 +512,23 @@ } } +// Issue: https://github.com/flutter/flutter/issues/33050 +// Matches the following patterns: +// HttpException: Connection closed before full header was received, uri = * +// HttpException: , uri = * +final RegExp kAndroidQHttpConnectionClosedExp = RegExp(r'^HttpException\:.+\, uri \=.+$'); + +/// Returns `true` if any of the devices is running Android Q. +Future<bool> hasDeviceRunningAndroidQ(List<FlutterDevice> flutterDevices) async { + for (FlutterDevice flutterDevice in flutterDevices) { + final String sdkNameAndVersion = await flutterDevice.device.sdkNameAndVersion; + if (sdkNameAndVersion != null && sdkNameAndVersion.startsWith('Android 10')) { + return true; + } + } + return false; +} + // Shared code between different resident application runners. abstract class ResidentRunner { ResidentRunner(
diff --git a/packages/flutter_tools/lib/src/run_cold.dart b/packages/flutter_tools/lib/src/run_cold.dart index 6a79afc..12b494c 100644 --- a/packages/flutter_tools/lib/src/run_cold.dart +++ b/packages/flutter_tools/lib/src/run_cold.dart
@@ -131,6 +131,13 @@ await connectToServiceProtocol(); } catch (error) { printError('Error connecting to the service protocol: $error'); + // https://github.com/flutter/flutter/issues/33050 + // TODO(blasten): Remove this check once https://issuetracker.google.com/issues/132325318 has been fixed. + if (await hasDeviceRunningAndroidQ(flutterDevices) && + error.toString().contains(kAndroidQHttpConnectionClosedExp)) { + printStatus('🔨 If you are using an emulator running Android Q Beta, consider using an emulator running API level 29 or lower.'); + printStatus('Learn more about the status of this issue on https://issuetracker.google.com/issues/132325318'); + } return 2; } for (FlutterDevice device in flutterDevices) {
diff --git a/packages/flutter_tools/lib/src/run_hot.dart b/packages/flutter_tools/lib/src/run_hot.dart index 7a8105d..4b09b2b 100644 --- a/packages/flutter_tools/lib/src/run_hot.dart +++ b/packages/flutter_tools/lib/src/run_hot.dart
@@ -155,6 +155,13 @@ ); } catch (error) { printError('Error connecting to the service protocol: $error'); + // https://github.com/flutter/flutter/issues/33050 + // TODO(blasten): Remove this check once https://issuetracker.google.com/issues/132325318 has been fixed. + if (await hasDeviceRunningAndroidQ(flutterDevices) && + error.toString().contains(kAndroidQHttpConnectionClosedExp)) { + printStatus('🔨 If you are using an emulator running Android Q Beta, consider using an emulator running API level 29 or lower.'); + printStatus('Learn more about the status of this issue on https://issuetracker.google.com/issues/132325318.'); + } return 2; }