diff --git a/packages/flutter_tools/lib/src/android/android_device.dart b/packages/flutter_tools/lib/src/android/android_device.dart index 680b82ff9d7..fdb9ebfe7ea 100644 --- a/packages/flutter_tools/lib/src/android/android_device.dart +++ b/packages/flutter_tools/lib/src/android/android_device.dart @@ -364,7 +364,8 @@ class AndroidDevice extends Device { final TargetPlatform devicePlatform = await targetPlatform; if (!(devicePlatform == TargetPlatform.android_arm || devicePlatform == TargetPlatform.android_arm64) && - !debuggingOptions.buildInfo.isDebug) { + !(debuggingOptions.buildInfo.isDebug || + debuggingOptions.buildInfo.isDynamic)) { printError('Profile and release builds are only supported on ARM targets.'); return LaunchResult.failed(); } diff --git a/packages/flutter_tools/lib/src/base/build.dart b/packages/flutter_tools/lib/src/base/build.dart index 894c6254ef5..a70cc061b4d 100644 --- a/packages/flutter_tools/lib/src/base/build.dart +++ b/packages/flutter_tools/lib/src/base/build.dart @@ -458,8 +458,25 @@ class JITSnapshotter { outputPaths.add(isolateSnapshotInstructions); } + // There are a couple special cases below where we create a snapshot + // with only the data section, which only contains interpreted code. + bool supportsAppJit = true; + + if (platform == TargetPlatform.android_x64 && + getCurrentHostPlatform() == HostPlatform.windows_x64) { + supportsAppJit = false; + printStatus('Android x64 dynamic build on Windows x64 will use purely interpreted ' + 'code for now (see https://github.com/flutter/flutter/issues/17489).'); + } + + if (platform == TargetPlatform.android_x86) { + supportsAppJit = false; + printStatus('Android x86 dynamic build will use purely interpreted code for now. ' + 'To optimize performance, consider using --target-platform=android-x64.'); + } + genSnapshotArgs.addAll([ - '--snapshot_kind=app-jit', + '--snapshot_kind=${supportsAppJit ? 'app-jit' : 'app'}', '--load_compilation_trace=$compilationTraceFilePath', '--load_vm_snapshot_data=$engineVmSnapshotData', '--load_isolate_snapshot_data=$engineIsolateSnapshotData', @@ -533,6 +550,8 @@ class JITSnapshotter { return const [ TargetPlatform.android_arm, TargetPlatform.android_arm64, + TargetPlatform.android_x86, + TargetPlatform.android_x64, ].contains(platform); } } diff --git a/packages/flutter_tools/lib/src/build_info.dart b/packages/flutter_tools/lib/src/build_info.dart index 7e4152abf5a..0e6334296a9 100644 --- a/packages/flutter_tools/lib/src/build_info.dart +++ b/packages/flutter_tools/lib/src/build_info.dart @@ -153,7 +153,11 @@ bool isAotBuildMode(BuildMode mode) { } // Returns true if the given build mode can be used on emulators / simulators. -bool isEmulatorBuildMode(BuildMode mode) => mode == BuildMode.debug; +bool isEmulatorBuildMode(BuildMode mode) { + return mode == BuildMode.debug || + mode == BuildMode.dynamicRelease || + mode == BuildMode.dynamicProfile; +} enum HostPlatform { darwin_x64, diff --git a/packages/flutter_tools/lib/src/commands/build_apk.dart b/packages/flutter_tools/lib/src/commands/build_apk.dart index a8f9b72462a..d76a421b552 100644 --- a/packages/flutter_tools/lib/src/commands/build_apk.dart +++ b/packages/flutter_tools/lib/src/commands/build_apk.dart @@ -28,7 +28,7 @@ class BuildApkCommand extends BuildSubCommand { ) ..addOption('target-platform', defaultsTo: 'android-arm', - allowed: ['android-arm', 'android-arm64']); + allowed: ['android-arm', 'android-arm64', 'android-x86', 'android-x64']); } @override diff --git a/packages/flutter_tools/lib/src/commands/build_bundle.dart b/packages/flutter_tools/lib/src/commands/build_bundle.dart index 6e2177ff30d..4093787efc8 100644 --- a/packages/flutter_tools/lib/src/commands/build_bundle.dart +++ b/packages/flutter_tools/lib/src/commands/build_bundle.dart @@ -30,7 +30,7 @@ class BuildBundleCommand extends BuildSubCommand { ..addOption('depfile', defaultsTo: defaultDepfilePath) ..addOption('target-platform', defaultsTo: 'android-arm', - allowed: ['android-arm', 'android-arm64', 'ios'] + allowed: ['android-arm', 'android-arm64', 'android-x86', 'android-x64', 'ios'] ) ..addFlag('track-widget-creation', hide: !verboseHelp, diff --git a/packages/flutter_tools/lib/src/commands/run.dart b/packages/flutter_tools/lib/src/commands/run.dart index f68518afbdb..067362d738a 100644 --- a/packages/flutter_tools/lib/src/commands/run.dart +++ b/packages/flutter_tools/lib/src/commands/run.dart @@ -49,7 +49,7 @@ abstract class RunCommandBase extends FlutterCommand { ) ..addOption('target-platform', defaultsTo: 'default', - allowed: ['default', 'android-arm', 'android-arm64'], + allowed: ['default', 'android-arm', 'android-arm64', 'android-x86', 'android-x64'], help: 'Specify the target platform when building the app for an ' 'Android device.\nIgnored on iOS.'); usesTargetOption();