fixes found when running through the getting started process
diff --git a/packages/flutter_tools/lib/src/android/adb.dart b/packages/flutter_tools/lib/src/android/adb.dart index e8b0f94..f5a5840 100644 --- a/packages/flutter_tools/lib/src/android/adb.dart +++ b/packages/flutter_tools/lib/src/android/adb.dart
@@ -181,9 +181,8 @@ } } - // Convert `Nexus_7` / `Nexus_5X` style names to `Nexus 7` ones. if (modelID != null) - modelID = modelID.replaceAll('_', ' '); + modelID = cleanAdbDeviceName(modelID); } static final RegExp deviceRegex = new RegExp(r'^(\S+)\s+(\S+)(.*)'); @@ -235,6 +234,16 @@ } } +String cleanAdbDeviceName(String name) { + // Some emulators use `___` in the name as separators. + name = name.replaceAll('___', ', '); + + // Convert `Nexus_7` / `Nexus_5X` style names to `Nexus 7` ones. + name = name.replaceAll('_', ' '); + + return name; +} + List<int> _createAdbRequest(String payload) { List<int> data = payload.codeUnits;
diff --git a/packages/flutter_tools/lib/src/android/android_sdk.dart b/packages/flutter_tools/lib/src/android/android_sdk.dart index 0271f3a..b67000a 100644 --- a/packages/flutter_tools/lib/src/android/android_sdk.dart +++ b/packages/flutter_tools/lib/src/android/android_sdk.dart
@@ -23,7 +23,10 @@ // Perhaps something like `flutter config --android-home=foo/bar`. /// Locate ADB. Prefer to use one from an Android SDK, if we can locate that. -String getAdbPath() { +String getAdbPath([AndroidSdk existingSdk]) { + if (existingSdk?.adbPath != null) + return existingSdk.adbPath; + AndroidSdk sdk = AndroidSdk.locateAndroidSdk(); if (sdk?.latestVersion == null) {
diff --git a/packages/flutter_tools/lib/src/android/device_android.dart b/packages/flutter_tools/lib/src/android/device_android.dart index 0f7c4d0..5a3ec9c 100644 --- a/packages/flutter_tools/lib/src/android/device_android.dart +++ b/packages/flutter_tools/lib/src/android/device_android.dart
@@ -8,6 +8,7 @@ import 'package:crypto/crypto.dart'; import 'package:path/path.dart' as path; +import '../android/android_sdk.dart'; import '../application_package.dart'; import '../base/common.dart'; import '../base/globals.dart'; @@ -17,6 +18,7 @@ import '../device.dart'; import '../flx.dart' as flx; import '../toolchain.dart'; +import 'adb.dart'; import 'android.dart'; const String _defaultAdbPath = 'adb'; @@ -249,7 +251,12 @@ if (route != null) cmd.addAll(<String>['--es', 'route', route]); cmd.add(apk.launchActivity); - runCheckedSync(cmd); + String result = runCheckedSync(cmd); + // This invocation returns 0 even when it fails. + if (result.contains('Error: ')) { + printError(result.trim()); + return false; + } return true; } @@ -410,10 +417,10 @@ } List<AndroidDevice> getAdbDevices() { - if (androidSdk == null) + String adbPath = getAdbPath(androidSdk); + if (adbPath == null) return <AndroidDevice>[]; - String adbPath = androidSdk.adbPath; List<AndroidDevice> devices = []; List<String> output = runSync(<String>[adbPath, 'devices', '-l']).trim().split('\n'); @@ -445,9 +452,8 @@ String modelID = match[3]; String deviceCodeName = match[4]; - // Convert `Nexus_7` / `Nexus_5X` style names to `Nexus 7` ones. if (modelID != null) - modelID = modelID.replaceAll('_', ' '); + modelID = cleanAdbDeviceName(modelID); devices.add(new AndroidDevice( deviceID,
diff --git a/packages/flutter_tools/lib/src/commands/apk.dart b/packages/flutter_tools/lib/src/commands/apk.dart index 60f9861..c051ef0 100644 --- a/packages/flutter_tools/lib/src/commands/apk.dart +++ b/packages/flutter_tools/lib/src/commands/apk.dart
@@ -369,6 +369,17 @@ String flxPath: '', ApkKeystoreInfo keystore }) async { + // Validate that we can find an android sdk. + if (androidSdk == null) { + printError('No Android SDK found.'); + return 1; + } + + if (!androidSdk.validateSdkWellFormed(complain: true)) { + printError('Try re-installing or updating your Android SDK.'); + return 1; + } + if (!force && !_needsRebuild(outputFile, manifest)) { printTrace('APK up to date. Skipping build step.'); return 0; @@ -437,13 +448,17 @@ continue; } - await buildAndroid( + int result = await buildAndroid( toolchain: toolchain, configs: configs, enginePath: enginePath, force: false, target: target ); + if (result != 0) + return result; } } + + return 0; }
diff --git a/packages/flutter_tools/lib/src/commands/create.dart b/packages/flutter_tools/lib/src/commands/create.dart index 3428caa..6b439eb 100644 --- a/packages/flutter_tools/lib/src/commands/create.dart +++ b/packages/flutter_tools/lib/src/commands/create.dart
@@ -57,7 +57,7 @@ All done! To run your application: \$ cd ${out.path} - \$ flutter start + \$ flutter run '''; if (argResults['pub']) { @@ -152,8 +152,8 @@ // Android files. files['android/AndroidManifest.xml'] = _apkManifest; - // Create a file here, so we create the directory for the user and it gets committed with git. - files['android/res/README.md'] = _androidResReadme; + // Create a file here in order to create the res/ directory and ensure it gets committed to git. + files['android/res/.empty'] = _androidEmptyFile; // iOS files. files.addAll(iosTemplateFiles); @@ -285,6 +285,6 @@ </manifest> '''; -final String _androidResReadme = ''' +final String _androidEmptyFile = ''' Place Android resources here (http://developer.android.com/guide/topics/resources/overview.html). ''';
diff --git a/packages/flutter_tools/lib/src/commands/daemon.dart b/packages/flutter_tools/lib/src/commands/daemon.dart index a8b5068..c3aec31 100644 --- a/packages/flutter_tools/lib/src/commands/daemon.dart +++ b/packages/flutter_tools/lib/src/commands/daemon.dart
@@ -356,7 +356,7 @@ void _initAdb() { if (_adb == null) { - _adb = new Adb(getAdbPath()); + _adb = new Adb(getAdbPath(androidSdk)); if (!_adb.exists()) _adb = null; }
diff --git a/packages/flutter_tools/lib/src/commands/logs.dart b/packages/flutter_tools/lib/src/commands/logs.dart index 1e31dd5..81956b6 100644 --- a/packages/flutter_tools/lib/src/commands/logs.dart +++ b/packages/flutter_tools/lib/src/commands/logs.dart
@@ -23,9 +23,6 @@ bool get requiresProjectRoot => false; Future<int> runInProject() async { - DeviceManager deviceManager = new DeviceManager(); - deviceManager.specifiedDeviceId = globalResults['device-id']; - List<Device> devices = await deviceManager.getDevices(); if (devices.isEmpty && deviceManager.hasSpecifiedDeviceId) {
diff --git a/packages/flutter_tools/lib/src/commands/run.dart b/packages/flutter_tools/lib/src/commands/run.dart index fee7a3a..7759cd6 100644 --- a/packages/flutter_tools/lib/src/commands/run.dart +++ b/packages/flutter_tools/lib/src/commands/run.dart
@@ -131,7 +131,6 @@ bool startPaused: false, int debugPort: observatoryDefaultPort }) async { - String mainPath = findMainDartFile(target); if (!FileSystemEntity.isFileSync(mainPath)) { String message = 'Tried to run $mainPath, but that file does not exist.'; @@ -143,11 +142,13 @@ if (install) { printTrace('Running build command.'); - await buildAll( + int result = await buildAll( devices, applicationPackages, toolchain, configs, enginePath: enginePath, target: target ); + if (result != 0) + return result; } if (stop) {
diff --git a/packages/flutter_tools/lib/src/ios/device_ios.dart b/packages/flutter_tools/lib/src/ios/device_ios.dart index 4ab15bf..f705fd0 100644 --- a/packages/flutter_tools/lib/src/ios/device_ios.dart +++ b/packages/flutter_tools/lib/src/ios/device_ios.dart
@@ -348,7 +348,12 @@ args.add("--observatory-port=$debugPort"); // Step 5: Launch the updated application in the simulator - SimControl.launch(id, app.id, args); + try { + SimControl.launch(id, app.id, args); + } catch (error) { + printError('$error'); + return false; + } printTrace('Successfully started ${app.name} on $id'); @@ -388,6 +393,12 @@ randomFile.closeSync(); } } + + void ensureLogsExists() { + File logFile = new File(logFilePath); + if (!logFile.existsSync()) + logFile.writeAsBytesSync(<int>[]); + } } class _IOSDeviceLogReader extends DeviceLogReader { @@ -427,6 +438,8 @@ final IOSSimulator device; + bool _lastWasFiltered = false; + String get name => device.name; Future<int> logs({ bool clear: false }) async { @@ -436,6 +449,8 @@ if (clear) device.clearLogs(); + device.ensureLogsExists(); + // Match the log prefix (in order to shorten it): // 'Jan 29 01:31:44 devoncarew-macbookpro3 SpringBoard[96648]: ...' RegExp mapRegex = new RegExp(r'\S+ +\S+ +\S+ \S+ (.+)\[\d+\]\)?: (.*)$'); @@ -453,19 +468,25 @@ mapFunction: (String string) { Match match = mapRegex.matchAsPrefix(string); if (match != null) { + _lastWasFiltered = true; + // Filter out some messages that clearly aren't related to Flutter. if (string.contains(': could not find icon for representation -> com.apple.')) return null; String category = match.group(1); String content = match.group(2); - if (category == 'Game Center' || category == 'itunesstored' || category == 'nanoregistrylaunchd') + if (category == 'Game Center' || category == 'itunesstored' || category == 'nanoregistrylaunchd' || + category == 'mstreamd' || category == 'syncdefaultsd' || category == 'companionappd' || category == 'searchd') return null; - if (category == 'FlutterRunner') + + _lastWasFiltered = false; + + if (category == 'FlutterRunner' || category == 'Runner') return content; return '$category: $content'; } match = lastMessageRegex.matchAsPrefix(string); - if (match != null) + if (match != null && !_lastWasFiltered) return '(${match.group(1)})'; return string; }