Run iOS gen_snapshot as x86_64 arch (#16323)

We are about to begin building gen_snapshot as a multi-arch binary,
which when run as x86_64 will generate arm64 AOT output, and when run as
i386 will generate armv7 AOT output.

Currently, gen_snapshot is an x86_64 binary, so this change is
effectively preventative in nature, and is a no-op with the current
snapshotter.
diff --git a/packages/flutter_tools/lib/src/base/build.dart b/packages/flutter_tools/lib/src/base/build.dart
index 57ab3b9..56c8386 100644
--- a/packages/flutter_tools/lib/src/base/build.dart
+++ b/packages/flutter_tools/lib/src/base/build.dart
@@ -50,6 +50,15 @@
       '--print_snapshot_sizes',
     ]..addAll(additionalArgs);
     final String snapshotterPath = artifacts.getArtifactPath(Artifact.genSnapshot, snapshotType.platform, snapshotType.mode);
+
+    // iOS gen_snapshot is a multi-arch binary. Running as an i386 binary will
+    // generate armv7 code. Running as an x86_64 binary will generate arm64
+    // code. /usr/bin/arch can be used to run binaries with the specified
+    // architecture.
+    if (snapshotType.platform == TargetPlatform.ios) {
+      // TODO(cbracken): for the moment, always generate only arm64 code.
+      return runCommandAndStreamOutput(<String>['/usr/bin/arch', '-x86_64', snapshotterPath]..addAll(args));
+    }
     return runCommandAndStreamOutput(<String>[snapshotterPath]..addAll(args));
   }
 }
diff --git a/packages/flutter_tools/lib/src/commands/build_aot.dart b/packages/flutter_tools/lib/src/commands/build_aot.dart
index 65e41c6..52a3fb6 100644
--- a/packages/flutter_tools/lib/src/commands/build_aot.dart
+++ b/packages/flutter_tools/lib/src/commands/build_aot.dart
@@ -260,7 +260,16 @@
     return null;
   }
 
-  final List<String> genSnapshotCmd = <String>[
+  final List<String> genSnapshotCmd = <String>[];
+  // iOS gen_snapshot is a multi-arch binary. Running as an i386 binary will
+  // generate armv7 code. Running as an x86_64 binary will generate arm64
+  // code. /usr/bin/arch can be used to run binaries with the specified
+  // architecture.
+  //
+  // TODO(cbracken): update the GenSnapshot class to handle AOT builds.
+  if (platform == TargetPlatform.ios)
+    genSnapshotCmd.addAll(<String>['arch', '-x86_64']);
+  genSnapshotCmd.addAll(<String>[
     genSnapshot,
     '--await_is_keyword',
     '--vm_snapshot_data=$vmSnapshotData',
@@ -271,7 +280,7 @@
     '--print_snapshot_sizes',
     '--dependencies=$dependencies',
     '--causal_async_stacks',
-  ];
+  ]);
 
   if ((extraFrontEndOptions != null) && extraFrontEndOptions.isNotEmpty)
     printTrace('Extra front-end options: $extraFrontEndOptions');