diff --git a/packages/flutter_tools/lib/src/application_package.dart b/packages/flutter_tools/lib/src/application_package.dart
index 68f028c..76c1d9b 100644
--- a/packages/flutter_tools/lib/src/application_package.dart
+++ b/packages/flutter_tools/lib/src/application_package.dart
@@ -69,7 +69,8 @@
         return applicationBinary == null
             ? WindowsApp.fromWindowsProject(FlutterProject.current().windows)
             : WindowsApp.fromPrebuiltApp(applicationBinary);
-      case TargetPlatform.fuchsia:
+      case TargetPlatform.fuchsia_arm64:
+      case TargetPlatform.fuchsia_x64:
         return applicationBinary == null
             ? FuchsiaApp.fromFuchsiaProject(FlutterProject.current().fuchsia)
             : FuchsiaApp.fromPrebuiltApp(applicationBinary);
@@ -424,7 +425,8 @@
       case TargetPlatform.ios:
         iOS ??= await IOSApp.fromIosProject(FlutterProject.current().ios);
         return iOS;
-      case TargetPlatform.fuchsia:
+      case TargetPlatform.fuchsia_arm64:
+      case TargetPlatform.fuchsia_x64:
         fuchsia ??= FuchsiaApp.fromFuchsiaProject(FlutterProject.current().fuchsia);
         return fuchsia;
       case TargetPlatform.darwin_x64:
diff --git a/packages/flutter_tools/lib/src/artifacts.dart b/packages/flutter_tools/lib/src/artifacts.dart
index c989236..fa12f56 100644
--- a/packages/flutter_tools/lib/src/artifacts.dart
+++ b/packages/flutter_tools/lib/src/artifacts.dart
@@ -58,6 +58,12 @@
   skyEnginePath,
   /// The location of the macOS engine podspec file.
   flutterMacOSPodspec,
+
+  // Fuchsia artifacts from the engine prebuilts.
+  fuchsiaKernelCompiler,
+  fuchsiaPlatformDill,
+  fuchsiaPatchedSdk,
+  fuchsiaFlutterJitRunner,
 }
 
 String _artifactToFileName(Artifact artifact, [ TargetPlatform platform, BuildMode mode ]) {
@@ -130,6 +136,17 @@
       return 'FlutterMacOS.podspec';
     case Artifact.webPlatformKernelDill:
       return 'flutter_ddc_sdk.dill';
+    case Artifact.fuchsiaKernelCompiler:
+      return 'kernel_compiler.snapshot';
+    case Artifact.fuchsiaPlatformDill:
+      return 'platform_strong.dill';
+    case Artifact.fuchsiaPatchedSdk:
+      return 'flutter_runner_patched_sdk';
+    case Artifact.fuchsiaFlutterJitRunner:
+      if (mode == BuildMode.debug || mode == BuildMode.profile) {
+        return 'flutter_jit_runner-0.far';
+      }
+      return 'flutter_jit_product_runner-0.far';
   }
   assert(false, 'Invalid artifact $artifact.');
   return null;
@@ -190,8 +207,10 @@
         return _getIosArtifactPath(artifact, platform, mode);
       case TargetPlatform.darwin_x64:
         return _getDarwinArtifactPath(artifact, platform, mode);
+      case TargetPlatform.fuchsia_arm64:
+      case TargetPlatform.fuchsia_x64:
+        return _getFuchsiaArtifactPath(artifact, platform, mode);
       case TargetPlatform.linux_x64:
-      case TargetPlatform.fuchsia:
       case TargetPlatform.windows_x64:
       case TargetPlatform.tester:
       case TargetPlatform.web_javascript:
@@ -258,6 +277,28 @@
     }
   }
 
+  String _getFuchsiaArtifactPath(Artifact artifact, TargetPlatform platform, BuildMode mode) {
+    final String artifactFileName = _artifactToFileName(artifact, platform, mode);
+    final String root = fs.path.join(
+      cache.getArtifactDirectory('flutter_runner').path,
+      'flutter',
+      fuchsiaArchForTargetPlatform(platform),
+      getNameForBuildMode(mode),
+    );
+    switch (artifact) {
+      case Artifact.fuchsiaKernelCompiler:
+        return fs.path.join(root, 'jit', 'dart_binaries', artifactFileName);
+      case Artifact.fuchsiaPlatformDill:
+        return fs.path.join(root, 'jit', 'flutter_runner_patched_sdk', artifactFileName);
+      case Artifact.fuchsiaPatchedSdk:
+      case Artifact.fuchsiaFlutterJitRunner:
+        return fs.path.join(root, 'jit', artifactFileName);
+      default:
+        assert(false, 'Artifact $artifact not available for platform $platform.');
+        return null;
+    }
+  }
+
   String _getFlutterPatchedSdkPath(BuildMode mode) {
     final String engineArtifactsPath = cache.getArtifactDirectory('engine').path;
     return fs.path.join(engineArtifactsPath, 'common',
@@ -339,7 +380,8 @@
         }
         final String suffix = mode != BuildMode.debug ? '-${snakeCase(getModeName(mode), '-')}' : '';
         return fs.path.join(engineDir, platformName + suffix);
-      case TargetPlatform.fuchsia:
+      case TargetPlatform.fuchsia_arm64:
+      case TargetPlatform.fuchsia_x64:
       case TargetPlatform.tester:
       case TargetPlatform.web_javascript:
         assert(mode == null, 'Platform $platform does not support different build modes.');
@@ -430,6 +472,12 @@
         return fs.path.join(_hostEngineOutPath, _artifactToFileName(artifact));
       case Artifact.webPlatformKernelDill:
         return fs.path.join(_getFlutterWebSdkPath(), 'kernel', _artifactToFileName(artifact));
+      case Artifact.fuchsiaKernelCompiler:
+      case Artifact.fuchsiaPlatformDill:
+      case Artifact.fuchsiaPatchedSdk:
+      case Artifact.fuchsiaFlutterJitRunner:
+        assert(false, 'Invalid local engine artifact $artifact.');
+        return null;
     }
     assert(false, 'Invalid artifact $artifact.');
     return null;
diff --git a/packages/flutter_tools/lib/src/build_info.dart b/packages/flutter_tools/lib/src/build_info.dart
index fc6a8c8..56e7907 100644
--- a/packages/flutter_tools/lib/src/build_info.dart
+++ b/packages/flutter_tools/lib/src/build_info.dart
@@ -314,7 +314,8 @@
   darwin_x64,
   linux_x64,
   windows_x64,
-  fuchsia,
+  fuchsia_arm64,
+  fuchsia_x64,
   tester,
   web_javascript,
 }
@@ -382,8 +383,10 @@
       return 'linux-x64';
     case TargetPlatform.windows_x64:
       return 'windows-x64';
-    case TargetPlatform.fuchsia:
-      return 'fuchsia';
+    case TargetPlatform.fuchsia_arm64:
+      return 'fuchsia-arm64';
+    case TargetPlatform.fuchsia_x64:
+      return 'fuchsia-x64';
     case TargetPlatform.tester:
       return 'flutter-tester';
     case TargetPlatform.web_javascript:
@@ -403,6 +406,10 @@
       return TargetPlatform.android_x64;
     case 'android-x86':
       return TargetPlatform.android_x86;
+    case 'fuchsia-arm64':
+      return TargetPlatform.fuchsia_arm64;
+    case 'fuchsia-x64':
+      return TargetPlatform.fuchsia_x64;
     case 'ios':
       return TargetPlatform.ios;
     case 'darwin-x64':
@@ -463,6 +470,18 @@
   return null;
 }
 
+String fuchsiaArchForTargetPlatform(TargetPlatform targetPlatform) {
+  switch (targetPlatform) {
+    case TargetPlatform.fuchsia_arm64:
+      return 'arm64';
+    case TargetPlatform.fuchsia_x64:
+      return 'x64';
+    default:
+      assert(false);
+      return null;
+  }
+}
+
 HostPlatform getCurrentHostPlatform() {
   if (platform.isMacOS) {
     return HostPlatform.darwin_x64;
diff --git a/packages/flutter_tools/lib/src/commands/build_fuchsia.dart b/packages/flutter_tools/lib/src/commands/build_fuchsia.dart
index 39e0a84..665fbc3 100644
--- a/packages/flutter_tools/lib/src/commands/build_fuchsia.dart
+++ b/packages/flutter_tools/lib/src/commands/build_fuchsia.dart
@@ -10,6 +10,7 @@
 import '../build_info.dart';
 import '../cache.dart';
 import '../fuchsia/fuchsia_build.dart';
+import '../fuchsia/fuchsia_pm.dart';
 import '../project.dart';
 import '../runner/flutter_command.dart' show FlutterCommandResult;
 import 'build.dart';
@@ -19,6 +20,17 @@
   BuildFuchsiaCommand({bool verboseHelp = false}) {
     usesTargetOption();
     addBuildModeFlags(verboseHelp: verboseHelp);
+    argParser.addOption(
+      'runner-source',
+      help: 'The package source to use for the flutter_runner. '
+            '"${FuchsiaPackageServer.deviceHost}" implies using a runner already on the device. '
+            '"${FuchsiaPackageServer.toolHost}" implies using a runner distributed with Flutter.',
+      allowed: <String>[
+        FuchsiaPackageServer.deviceHost,
+        FuchsiaPackageServer.toolHost,
+      ],
+      defaultsTo: FuchsiaPackageServer.toolHost,
+    );
   }
 
   @override
@@ -34,7 +46,7 @@
   };
 
   @override
-  String get description => 'build the Fuchsia target (Experimental).';
+  String get description => 'Build the Fuchsia target (Experimental).';
 
   @override
   Future<FlutterCommandResult> runCommand() async {
@@ -42,22 +54,24 @@
     final BuildInfo buildInfo = getBuildInfo();
     final FlutterProject flutterProject = FlutterProject.current();
     if (!platform.isLinux && !platform.isMacOS) {
-      throwToolExit('"build Fuchsia" only supported on Linux and MacOS hosts.');
+      throwToolExit('"build fuchsia" is only supported on Linux and MacOS hosts.');
     }
     if (!flutterProject.fuchsia.existsSync()) {
-      throwToolExit('No Fuchsia project configured.');
+      throwToolExit('No Fuchsia project is configured.');
     }
     final String appName = flutterProject.fuchsia.project.manifest.appName;
     final String cmxPath = fs.path.join(
         flutterProject.fuchsia.meta.path, '$appName.cmx');
     final File cmxFile = fs.file(cmxPath);
     if (!cmxFile.existsSync()) {
-      throwToolExit('Fuchsia build requires a .cmx file at $cmxPath for the app');
+      throwToolExit('The Fuchsia build requires a .cmx file at $cmxPath for the app.');
     }
     await buildFuchsia(
-        fuchsiaProject: flutterProject.fuchsia,
-        target: targetFile,
-        buildInfo: buildInfo);
+      fuchsiaProject: flutterProject.fuchsia,
+      target: targetFile,
+      buildInfo: buildInfo,
+      runnerPackageSource: argResults['runner-source'],
+    );
     return null;
   }
 }
diff --git a/packages/flutter_tools/lib/src/device.dart b/packages/flutter_tools/lib/src/device.dart
index 9fdd899..f9ee540 100644
--- a/packages/flutter_tools/lib/src/device.dart
+++ b/packages/flutter_tools/lib/src/device.dart
@@ -178,7 +178,8 @@
     if (hasSpecifiedAllDevices) {
       devices = <Device>[
         for (Device device in devices)
-          if (await device.targetPlatform != TargetPlatform.fuchsia &&
+          if (await device.targetPlatform != TargetPlatform.fuchsia_arm64 &&
+              await device.targetPlatform != TargetPlatform.fuchsia_x64 &&
               await device.targetPlatform != TargetPlatform.web_javascript)
             device,
       ];
@@ -339,7 +340,8 @@
       case TargetPlatform.darwin_x64:
       case TargetPlatform.linux_x64:
       case TargetPlatform.windows_x64:
-      case TargetPlatform.fuchsia:
+      case TargetPlatform.fuchsia_arm64:
+      case TargetPlatform.fuchsia_x64:
       default:
         return false;
     }
diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_build.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_build.dart
index c6bba28..9c855d2 100644
--- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_build.dart
+++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_build.dart
@@ -38,6 +38,7 @@
   @required FuchsiaProject fuchsiaProject,
   @required String target, // E.g., lib/main.dart
   BuildInfo buildInfo = BuildInfo.debug,
+  String runnerPackageSource = FuchsiaPackageServer.toolHost,
 }) async {
   final Directory outDir = fs.directory(getFuchsiaBuildDirectory());
   if (!outDir.existsSync()) {
@@ -50,7 +51,7 @@
   await _timedBuildStep('fuchsia-build-assets',
     () => _buildAssets(fuchsiaProject, target, buildInfo));
   await _timedBuildStep('fuchsia-build-package',
-    () => _buildPackage(fuchsiaProject, target, buildInfo));
+    () => _buildPackage(fuchsiaProject, target, buildInfo, runnerPackageSource));
 }
 
 Future<void> _buildAssets(
@@ -85,7 +86,7 @@
   await outFile.close();
 }
 
-void _rewriteCmx(BuildMode mode, File src, File dst) {
+void _rewriteCmx(BuildMode mode, String runnerPackageSource, File src, File dst) {
   final Map<String, dynamic> cmx = json.decode(src.readAsStringSync());
   // If the app author has already specified the runner in the cmx file, then
   // do not override it with something else.
@@ -106,7 +107,7 @@
       throwToolExit('Fuchsia does not support build mode "$mode"');
       break;
   }
-  cmx['runner'] = 'fuchsia-pkg://fuchsia.com/$runner#meta/$runner.cmx';
+  cmx['runner'] = 'fuchsia-pkg://$runnerPackageSource/$runner#meta/$runner.cmx';
   dst.writeAsStringSync(json.encode(cmx));
 }
 
@@ -115,6 +116,7 @@
   FuchsiaProject fuchsiaProject,
   String target, // lib/main.dart
   BuildInfo buildInfo,
+  String runnerPackageSource,
 ) async {
   final String outDir = getFuchsiaBuildDirectory();
   final String pkgDir = fs.path.join(outDir, 'pkg');
@@ -132,7 +134,7 @@
   final File srcCmx =
       fs.file(fs.path.join(fuchsiaProject.meta.path, '$appName.cmx'));
   final File dstCmx = fs.file(fs.path.join(outDir, '$appName.cmx'));
-  _rewriteCmx(buildInfo.mode, srcCmx, dstCmx);
+  _rewriteCmx(buildInfo.mode, runnerPackageSource, srcCmx, dstCmx);
 
   // Concatenate dilpmanifest and pkgassets into package_manifest.
   final File manifestFile = fs.file(packageManifest);
diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart
index 3e10f90..07be37c 100644
--- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart
+++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart
@@ -272,13 +272,15 @@
       }
 
       // Start up a package server.
-      const String packageServerName = 'flutter_tool';
+      const String packageServerName = FuchsiaPackageServer.toolHost;
       fuchsiaPackageServer = FuchsiaPackageServer(
           packageRepo.path, packageServerName, host, port);
       if (!await fuchsiaPackageServer.start()) {
         printError('Failed to start the Fuchsia package server');
         return LaunchResult.failed();
       }
+
+      // Serve the application's package.
       final File farArchive = package.farArchive(
           debuggingOptions.buildInfo.mode);
       if (!await fuchsiaPackageServer.addPackage(farArchive)) {
@@ -286,6 +288,17 @@
         return LaunchResult.failed();
       }
 
+      // Serve the flutter_runner.
+      final File flutterRunnerArchive = fs.file(artifacts.getArtifactPath(
+        Artifact.fuchsiaFlutterJitRunner,
+        platform: await targetPlatform,
+        mode: debuggingOptions.buildInfo.mode,
+      ));
+      if (!await fuchsiaPackageServer.addPackage(flutterRunnerArchive)) {
+        printError('Failed to add flutter_runner package to the package server');
+        return LaunchResult.failed();
+      }
+
       // Teach the package controller about the package server.
       if (!await fuchsiaDeviceTools.amberCtl.addRepoCfg(this, fuchsiaPackageServer)) {
         printError('Failed to teach amber about the package server');
@@ -293,6 +306,18 @@
       }
       serverRegistered = true;
 
+      // Tell the package controller to prefetch the flutter_runner.
+      String flutterRunnerName = 'flutter_jit_runner';
+      if (!debuggingOptions.buildInfo.isDebug &&
+          !debuggingOptions.buildInfo.isProfile) {
+        flutterRunnerName = 'flutter_jit_product_runner';
+      }
+      if (!await fuchsiaDeviceTools.amberCtl.pkgCtlResolve(
+          this, fuchsiaPackageServer, flutterRunnerName)) {
+        printError('Failed to get pkgctl to prefetch the flutter_runner');
+        return LaunchResult.failed();
+      }
+
       // Tell the package controller to prefetch the app.
       if (!await fuchsiaDeviceTools.amberCtl.pkgCtlResolve(
           this, fuchsiaPackageServer, appName)) {
@@ -353,8 +378,30 @@
     return true;
   }
 
+  TargetPlatform _targetPlatform;
+
+  Future<TargetPlatform> _queryTargetPlatform() async {
+    final RunResult result = await shell('uname -m');
+    if (result.exitCode != 0) {
+      printError('Could not determine Fuchsia target platform type:\n$result\n'
+                 'Defaulting to arm64.');
+      return TargetPlatform.fuchsia_arm64;
+    }
+    final String machine = result.stdout.trim();
+    switch (machine) {
+      case 'aarch64':
+        return TargetPlatform.fuchsia_arm64;
+      case 'x86_64':
+        return TargetPlatform.fuchsia_x64;
+      default:
+        printError('Unknown Fuchsia target platform "$machine". '
+                   'Defaulting to arm64.');
+        return TargetPlatform.fuchsia_arm64;
+    }
+  }
+
   @override
-  Future<TargetPlatform> get targetPlatform async => TargetPlatform.fuchsia;
+  Future<TargetPlatform> get targetPlatform async => _targetPlatform ??= await _queryTargetPlatform();
 
   @override
   Future<String> get sdkNameAndVersion async {
@@ -389,8 +436,16 @@
   OverrideArtifacts get artifactOverrides {
     return _artifactOverrides ??= OverrideArtifacts(
       parent: Artifacts.instance,
-      platformKernelDill: fuchsiaArtifacts.platformKernelDill,
-      flutterPatchedSdk: fuchsiaArtifacts.flutterPatchedSdk,
+      platformKernelDill: fs.file(artifacts.getArtifactPath(
+        Artifact.fuchsiaPlatformDill,
+        platform: TargetPlatform.fuchsia_x64,
+        mode: BuildMode.debug,
+      )),
+      flutterPatchedSdk: fs.file(artifacts.getArtifactPath(
+        Artifact.fuchsiaPatchedSdk,
+        platform: TargetPlatform.fuchsia_x64,
+        mode: BuildMode.debug,
+      )),
     );
   }
   OverrideArtifacts _artifactOverrides;
@@ -535,7 +590,7 @@
       'Waiting for a connection from $_isolateName on ${_device.name}...',
       timeout: null, // could take an arbitrary amount of time
     );
-    _pollingTimer ??= Timer(_pollDuration, _findIsolate);
+    unawaited(_findIsolate());  // Completes the _foundUri Future.
     return _foundUri.future.then((Uri uri) {
       _uri = uri;
       return uri;
diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_kernel_compiler.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_kernel_compiler.dart
index cccc8bb..aabe9a8 100644
--- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_kernel_compiler.dart
+++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_kernel_compiler.dart
@@ -15,8 +15,6 @@
 import '../globals.dart';
 import '../project.dart';
 
-import 'fuchsia_sdk.dart';
-
 /// This is a simple wrapper around the custom kernel compiler from the Fuchsia
 /// SDK.
 class FuchsiaKernelCompiler {
@@ -30,20 +28,32 @@
     BuildInfo buildInfo = BuildInfo.debug,
   }) async {
     // TODO(zra): Use filesystem root and scheme information from buildInfo.
-    if (fuchsiaArtifacts.kernelCompiler == null) {
-      throwToolExit('Fuchisa kernel compiler not found');
-    }
     const String multiRootScheme = 'main-root';
     final String packagesFile = fuchsiaProject.project.packagesFile.path;
     final String outDir = getFuchsiaBuildDirectory();
     final String appName = fuchsiaProject.project.manifest.appName;
     final String fsRoot = fuchsiaProject.project.directory.path;
-    final String relativePackagesFile =
-        fs.path.relative(packagesFile, from: fsRoot);
+    final String relativePackagesFile = fs.path.relative(packagesFile, from: fsRoot);
     final String manifestPath = fs.path.join(outDir, '$appName.dilpmanifest');
+    final String kernelCompiler = artifacts.getArtifactPath(
+      Artifact.fuchsiaKernelCompiler,
+      platform: TargetPlatform.fuchsia_x64,  // This file is not arch-specific.
+      mode: BuildMode.debug,
+    );
+    if (!fs.isFileSync(kernelCompiler)) {
+      throwToolExit('Fuchisa kernel compiler not found at "$kernelCompiler"');
+    }
+    final String platformDill = artifacts.getArtifactPath(
+      Artifact.fuchsiaPlatformDill,
+      platform: TargetPlatform.fuchsia_x64,  // This file is not arch-specific.
+      mode: buildInfo.mode,
+    );
+    if (!fs.isFileSync(platformDill)) {
+      throwToolExit('Fuchisa platform file not found at "$platformDill"');
+    }
     List<String> flags = <String>[
       '--target', 'flutter_runner',
-      '--platform', fuchsiaArtifacts.platformKernelDill.path,
+      '--platform', platformDill,
       '--filesystem-scheme', 'main-root',
       '--filesystem-root', fsRoot,
       '--packages', '$multiRootScheme:///$relativePackagesFile',
@@ -82,7 +92,7 @@
 
     final List<String> command = <String>[
       artifacts.getArtifactPath(Artifact.engineDartBinary),
-      fuchsiaArtifacts.kernelCompiler.path,
+      artifacts.getArtifactPath(Artifact.fuchsiaKernelCompiler),
       ...flags,
     ];
     final Process process = await processUtils.start(command);
diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_pm.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_pm.dart
index 5a0eda6..80ad58e 100644
--- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_pm.dart
+++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_pm.dart
@@ -178,6 +178,9 @@
 class FuchsiaPackageServer {
   FuchsiaPackageServer(this._repo, this.name, this._host, this._port);
 
+  static const String deviceHost = 'fuchsia.com';
+  static const String toolHost = 'flutter_tool';
+
   final String _repo;
   final String _host;
   final int _port;
diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_sdk.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_sdk.dart
index 11cda6c..0474c48 100644
--- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_sdk.dart
+++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_sdk.dart
@@ -102,9 +102,6 @@
   FuchsiaArtifacts({
     this.sshConfig,
     this.devFinder,
-    this.platformKernelDill,
-    this.flutterPatchedSdk,
-    this.kernelCompiler,
     this.pm,
   });
 
@@ -119,19 +116,6 @@
       // Don't try to find the artifacts on platforms that are not supported.
       return FuchsiaArtifacts();
     }
-    final String fuchsia = Cache.instance.getArtifactDirectory('fuchsia').path;
-    final String tools = fs.path.join(fuchsia, 'tools');
-    final String dartPrebuilts = fs.path.join(tools, 'dart_prebuilts');
-
-    final File devFinder = fs.file(fs.path.join(tools, 'dev_finder'));
-    final File platformDill = fs.file(fs.path.join(
-          dartPrebuilts, 'flutter_runner', 'platform_strong.dill'));
-    final File patchedSdk = fs.file(fs.path.join(
-          dartPrebuilts, 'flutter_runner'));
-    final File kernelCompiler = fs.file(fs.path.join(
-          dartPrebuilts, 'kernel_compiler.snapshot'));
-    final File pm = fs.file(fs.path.join(tools, 'pm'));
-
     // If FUCHSIA_BUILD_DIR is defined, then look for the ssh_config dir
     // relative to it. Next, if FUCHSIA_SSH_CONFIG is defined, then use it.
     // TODO(zra): Consider passing the ssh config path in with a flag.
@@ -142,12 +126,15 @@
     } else if (platform.environment.containsKey(_kFuchsiaSshConfig)) {
       sshConfig = fs.file(platform.environment[_kFuchsiaSshConfig]);
     }
+
+    final String fuchsia = Cache.instance.getArtifactDirectory('fuchsia').path;
+    final String tools = fs.path.join(fuchsia, 'tools');
+    final File devFinder = fs.file(fs.path.join(tools, 'dev_finder'));
+    final File pm = fs.file(fs.path.join(tools, 'pm'));
+
     return FuchsiaArtifacts(
       sshConfig: sshConfig,
       devFinder: devFinder.existsSync() ? devFinder : null,
-      platformKernelDill: platformDill.existsSync() ? platformDill : null,
-      flutterPatchedSdk: patchedSdk.existsSync() ? patchedSdk : null,
-      kernelCompiler: kernelCompiler.existsSync() ? kernelCompiler : null,
       pm: pm.existsSync() ? pm : null,
     );
   }
@@ -163,15 +150,6 @@
   /// Fuchsia devices.
   final File devFinder;
 
-  /// The location of the Fuchsia-specific platform dill.
-  final File platformKernelDill;
-
-  /// The directory containing [platformKernelDill].
-  final File flutterPatchedSdk;
-
-  /// The snapshot of the Fuchsia kernel compiler.
-  final File kernelCompiler;
-
   /// The pm tool.
   final File pm;
 }
diff --git a/packages/flutter_tools/lib/src/runner/flutter_command.dart b/packages/flutter_tools/lib/src/runner/flutter_command.dart
index 8eff882..00087a1 100644
--- a/packages/flutter_tools/lib/src/runner/flutter_command.dart
+++ b/packages/flutter_tools/lib/src/runner/flutter_command.dart
@@ -734,7 +734,8 @@
         return DevelopmentArtifact.linux;
       }
       return null;
-    case TargetPlatform.fuchsia:
+    case TargetPlatform.fuchsia_arm64:
+    case TargetPlatform.fuchsia_x64:
     case TargetPlatform.tester:
       // No artifacts currently supported.
       return null;
