dissallow -release mode on emulators (#4204)
* dissallow -release mode on emulators
* have the help text print the default mode
diff --git a/packages/flutter_tools/lib/src/base/process.dart b/packages/flutter_tools/lib/src/base/process.dart
index 8c9209a..4969545 100644
--- a/packages/flutter_tools/lib/src/base/process.dart
+++ b/packages/flutter_tools/lib/src/base/process.dart
@@ -77,6 +77,7 @@
}
/// Run cmd and return stdout.
+///
/// Throws an error if cmd exits with a non-zero value.
String runCheckedSync(List<String> cmd, {
String workingDirectory, bool truncateCommand: false
diff --git a/packages/flutter_tools/lib/src/base/utils.dart b/packages/flutter_tools/lib/src/base/utils.dart
index 312739a..052e671 100644
--- a/packages/flutter_tools/lib/src/base/utils.dart
+++ b/packages/flutter_tools/lib/src/base/utils.dart
@@ -39,6 +39,12 @@
return str;
}
+String toTitleCase(String str) {
+ if (str.isEmpty)
+ return str;
+ return str.substring(0, 1).toUpperCase() + str.substring(1);
+}
+
/// Return the plural of the given word (`cat(s)`).
String pluralize(String word, int count) => count == 1 ? word : word + 's';
diff --git a/packages/flutter_tools/lib/src/build_info.dart b/packages/flutter_tools/lib/src/build_info.dart
index efa53c1..76b6632 100644
--- a/packages/flutter_tools/lib/src/build_info.dart
+++ b/packages/flutter_tools/lib/src/build_info.dart
@@ -27,6 +27,9 @@
return mode == BuildMode.profile || mode == BuildMode.release;
}
+// Returns true if the given build mode can be used on emulators / simulators.
+bool isEmulatorBuildMode(BuildMode mode) => mode == BuildMode.debug;
+
enum HostPlatform {
darwin_x64,
linux_x64,
diff --git a/packages/flutter_tools/lib/src/commands/build_aot.dart b/packages/flutter_tools/lib/src/commands/build_aot.dart
index c18bfdd..4915f1a 100644
--- a/packages/flutter_tools/lib/src/commands/build_aot.dart
+++ b/packages/flutter_tools/lib/src/commands/build_aot.dart
@@ -8,6 +8,7 @@
import 'package:path/path.dart' as path;
import '../base/process.dart';
+import '../base/utils.dart';
import '../build_info.dart';
import '../dart/sdk.dart';
import '../globals.dart';
@@ -69,6 +70,8 @@
return path.join(path.dirname(packageDir.resolveSymbolicLinksSync()), 'sdk_ext');
}
+/// Build an AOT snapshot. Return `null` (and log to `printError`) if the method
+/// fails.
String buildAotSnapshot(
String mainPath,
TargetPlatform platform,
@@ -76,8 +79,30 @@
String outputPath: _kDefaultAotOutputDir,
bool interpreter: false
}) {
+ try {
+ return _buildAotSnapshot(
+ mainPath,
+ platform,
+ buildMode,
+ outputPath: outputPath,
+ interpreter: interpreter
+ );
+ } on String catch (error) {
+ // Catch the String exceptions thrown from the `runCheckedSync` methods below.
+ printError(error);
+ return null;
+ }
+}
+
+String _buildAotSnapshot(
+ String mainPath,
+ TargetPlatform platform,
+ BuildMode buildMode, {
+ String outputPath: _kDefaultAotOutputDir,
+ bool interpreter: false
+}) {
if (!isAotBuildMode(buildMode)) {
- printError('${getModeName(buildMode)} mode does not support AOT compilation.');
+ printError('${toTitleCase(getModeName(buildMode))} mode does not support AOT compilation.');
return null;
}
@@ -120,8 +145,7 @@
String packagesPath = path.absolute(Directory.current.path, 'packages');
if (!FileSystemEntity.isDirectorySync(packagesPath)) {
- printStatus('Missing packages directory. Running `pub get` to work around\n' +
- 'https://github.com/dart-lang/sdk/issues/26362');
+ printStatus('Missing packages directory; running `pub get` (to work around https://github.com/dart-lang/sdk/issues/26362).');
// We don't use [pubGet] because we explicitly want to avoid --no-package-symlinks.
runCheckedSync(<String>[sdkBinaryName('pub'), 'get', '--no-precompile']);
}
@@ -229,8 +253,10 @@
genSnapshotCmd.add(mainPath);
- printStatus('Building snapshot...');
- runCheckedSync(genSnapshotCmd);
+ String typeName = path.basename(tools.getEngineArtifactsDirectory(platform, buildMode).path);
+ printStatus('Building snapshot in ${getModeName(buildMode)} mode ($typeName)...');
+
+ runCheckedSync(genSnapshotCmd, truncateCommand: true);
// On iOS, we use Xcode to compile the snapshot into a static library that the
// end-developer can link into their app.
diff --git a/packages/flutter_tools/lib/src/commands/run.dart b/packages/flutter_tools/lib/src/commands/run.dart
index 702e8f3..caadd29 100644
--- a/packages/flutter_tools/lib/src/commands/run.dart
+++ b/packages/flutter_tools/lib/src/commands/run.dart
@@ -22,7 +22,7 @@
abstract class RunCommandBase extends FlutterCommand {
RunCommandBase() {
- addBuildModeFlags();
+ addBuildModeFlags(defaultToRelease: false);
argParser.addFlag('trace-startup',
negatable: true,
@@ -99,6 +99,11 @@
}
}
+ if (deviceForCommand.isLocalEmulator && !isEmulatorBuildMode(getBuildMode())) {
+ printError('${toTitleCase(getModeName(getBuildMode()))} mode is not supported for emulators.');
+ return 1;
+ }
+
DebuggingOptions options;
if (getBuildMode() == BuildMode.release) {
diff --git a/packages/flutter_tools/lib/src/runner/flutter_command.dart b/packages/flutter_tools/lib/src/runner/flutter_command.dart
index 6f008e3..2917a5a 100644
--- a/packages/flutter_tools/lib/src/runner/flutter_command.dart
+++ b/packages/flutter_tools/lib/src/runner/flutter_command.dart
@@ -43,6 +43,8 @@
bool get shouldRunPub => _usesPubOption && argResults['pub'];
+ BuildMode _defaultBuildMode;
+
void usesTargetOption() {
argParser.addOption('target',
abbr: 't',
@@ -58,29 +60,31 @@
_usesPubOption = true;
}
- void addBuildModeFlags() {
+ void addBuildModeFlags({ bool defaultToRelease: true }) {
+ _defaultBuildMode = defaultToRelease ? BuildMode.release : BuildMode.debug;
+
argParser.addFlag('debug',
negatable: false,
- help: 'Build a debug version of your app (the default).');
+ help: 'Build a debug version of your app${defaultToRelease ? '' : ' (default mode)'}.');
argParser.addFlag('profile',
negatable: false,
- help: 'Build a profile (ahead of time compilation) version of your app.');
+ help: 'Build a version of your app specialized for performance profiling.');
argParser.addFlag('release',
negatable: false,
- help: 'Build a release version of your app.');
+ help: 'Build a release version of your app${defaultToRelease ? ' (default mode)' : ''}.');
}
BuildMode getBuildMode() {
List<bool> modeFlags = <bool>[argResults['debug'], argResults['profile'], argResults['release']];
if (modeFlags.where((bool flag) => flag).length > 1)
- throw new UsageException('Only one of --debug, --profile, or --release should be specified.', null);
-
- BuildMode mode = BuildMode.debug;
+ throw new UsageException('Only one of --debug, --profile, or --release can be specified.', null);
+ if (argResults['debug'])
+ return BuildMode.debug;
if (argResults['profile'])
- mode = BuildMode.profile;
+ return BuildMode.profile;
if (argResults['release'])
- mode = BuildMode.release;
- return mode;
+ return BuildMode.release;
+ return _defaultBuildMode;
}
void _setupApplicationPackages() {