diff --git a/sourcekit-lsp/Utilities/build-script-helper.py b/sourcekit-lsp/Utilities/build-script-helper.py
--- a/sourcekit-lsp/Utilities/build-script-helper.py
+++ b/sourcekit-lsp/Utilities/build-script-helper.py
@@ -93,6 +93,10 @@
 
 def handle_invocation(swift_exec, args):
   swiftpm_args = get_swiftpm_options(args)
+  if args.cross_compile_host and re.match('android-aarch64', args.cross_compile_host):
+    swiftpm_exec = os.path.join(os.path.realpath(os.getenv("SWIFT_BINDIR")), "swift")
+  else:
+    swiftpm_exec = swift_exec
 
   env = os.environ
   # Set the toolchain used in tests at runtime
@@ -120,7 +124,7 @@
   env['SWIFT_EXEC'] = '%sc' % (swift_exec)
 
   if args.action == 'build':
-    swiftpm('build', swift_exec, swiftpm_args, env)
+    swiftpm('build', swiftpm_exec, swiftpm_args, env)
   elif args.action == 'test':
     if not args.skip_long_tests:
       env['SOURCEKIT_LSP_ENABLE_LONG_TESTS'] = '1'
@@ -135,9 +139,9 @@
     test_args += ['--parallel']
     swiftpm('test', swift_exec, test_args, env)
   elif args.action == 'install':
-    bin_path = swiftpm_bin_path(swift_exec, swiftpm_args, env)
+    bin_path = swiftpm_bin_path(swiftpm_exec, swiftpm_args, env)
     swiftpm_args += ['-Xswiftc', '-no-toolchain-stdlib-rpath']
-    swiftpm('build', swift_exec, swiftpm_args, env)
+    swiftpm('build', swiftpm_exec, swiftpm_args, env)
 
     if not args.install_prefixes:
       args.install_prefixes = [args.toolchain]
diff --git a/swift/utils/swift_build_support/swift_build_support/products/product.py b/swift/utils/swift_build_support/swift_build_support/products/product.py
index 575fa374ad..3554577f92 100644
--- a/swift/utils/swift_build_support/swift_build_support/products/product.py
+++ b/swift/utils/swift_build_support/swift_build_support/products/product.py
@@ -202,7 +202,7 @@ class Product(object):
             if self.is_darwin_host(host_target):
                 install_destdir = self.host_install_destdir(host_target)
             else:
-                install_destdir = os.path.join(install_destdir, self.args.host_target)
+                return os.path.join(os.path.dirname(self.build_dir), "swift-%s" % self.args.host_target)
         return targets.toolchain_path(install_destdir,
                                       self.args.install_prefix)
 
diff --git a/swift-driver/Utilities/build-script-helper.py b/swift-driver/Utilities/build-script-helper.py
--- a/swift-driver/Utilities/build-script-helper.py
+++ b/swift-driver/Utilities/build-script-helper.py
@@ -166,6 +167,10 @@
   toolchain_bin = os.path.join(args.toolchain, 'bin')
   swift_exec = os.path.join(toolchain_bin, 'swift')
   swiftc_exec = os.path.join(toolchain_bin, 'swiftc')
+  if args.cross_compile_hosts and re.match('android-aarch64', args.cross_compile_hosts[0]):
+    swiftpm_exec = os.path.join(os.path.realpath(os.getenv("SWIFT_BINDIR")), "swift")
+  else:
+    swiftpm_exec = swift_exec
 
   # Platform-specific targets for which we must build swift-driver
   if args.cross_compile_hosts:
@@ -190,7 +194,7 @@
 
   if args.action == 'build':
     if args.cross_compile_hosts and not re.match('-macosx', args.cross_compile_hosts[0]):
-      swiftpm('build', swift_exec, swiftpm_args, env)
+      swiftpm('build', swiftpm_exec, swiftpm_args, env)
     else:
       build_using_cmake(args, toolchain_bin, args.build_path, targets)
 
@@ -216,8 +220,8 @@
       build_using_cmake(args, toolchain_bin, args.build_path, targets)
       install(args, args.build_path, targets)
     else:
-      bin_path = swiftpm_bin_path(swift_exec, swiftpm_args, env)
-      swiftpm('build', swift_exec, swiftpm_args, env)
+      bin_path = swiftpm_bin_path(swiftpm_exec, swiftpm_args, env)
+      swiftpm('build', swiftpm_exec, swiftpm_args, env)
       non_darwin_install(args, bin_path)
   else:
     assert False, 'unknown action \'{}\''.format(args.action)
diff --git a/swiftpm/Utilities/bootstrap b/swiftpm/Utilities/bootstrap
index 6ae084e9..379d1738 100755
--- a/swiftpm/Utilities/bootstrap
+++ b/swiftpm/Utilities/bootstrap
@@ -211,8 +211,9 @@ def parse_build_args(args):
     args.bootstrap_dir = os.path.join(args.target_dir, "bootstrap")
     args.conf = 'release' if args.release else 'debug'
     args.bin_dir = os.path.join(args.target_dir, args.conf)
-    args.bootstrap = not args.skip_cmake_bootstrap or \
-                     not os.path.exists(os.path.join(os.path.split(args.swiftc_path)[0], "swift-build"))
+    args.bootstrap = not args.skip_cmake_bootstrap or \
+                    (not (args.cross_compile_hosts and re.match('android-aarch64', args.cross_compile_hosts)) and \
+                     not os.path.exists(os.path.join(os.path.split(args.swiftc_path)[0], "swift-build")))
 
 def parse_test_args(args):
     """Parses and cleans arguments necessary for the test action."""
@@ -622,7 +623,10 @@ def build_swiftpm_with_swiftpm(args, integrated_swift_driver):
         swiftpm_args.append(os.path.join(args.bootstrap_dir, "bin/swift-build"))
     else:
         note("Building SwiftPM (with a prebuilt swift-build)")
-        swiftpm_args.append(os.path.join(os.path.split(args.swiftc_path)[0], "swift-build"))
+        if args.cross_compile_hosts and re.match('android-aarch64', args.cross_compile_hosts):
+            swiftpm_args.append(os.path.join(os.path.realpath(os.getenv("SWIFT_BINDIR")), "swift-build"))
+        else:
+            swiftpm_args.append(os.path.join(os.path.split(args.swiftc_path)[0], "swift-build"))
 
     swiftpm_args.append("--disable-sandbox")
 
