diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4dac9a46f1..2c867745e8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -70,9 +70,13 @@ include(XCTest)
 
 set(CF_DEPLOYMENT_SWIFT YES CACHE BOOL "Build for Swift" FORCE)
 
-set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
-set(THREADS_PREFER_PTHREAD_FLAG OFF)
 if(HAS_LIBDISPATCH_API)
+  set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
+  set(THREADS_PREFER_PTHREAD_FLAG OFF)
+  if(ANDROID)
+    set(CMAKE_THREAD_LIBS_INIT "-lc")
+    set(THREADS_HAVE_PTHREAD_ARG FALSE)
+  endif()
   find_package(Threads REQUIRED)
 endif()
 
diff --git a/CoreFoundation/Base.subproj/ForSwiftFoundationOnly.h b/CoreFoundation/Base.subproj/ForSwiftFoundationOnly.h
index cc1ba84355..5bd1e28303 100644
--- a/CoreFoundation/Base.subproj/ForSwiftFoundationOnly.h
+++ b/CoreFoundation/Base.subproj/ForSwiftFoundationOnly.h
@@ -64,6 +64,7 @@
 #include <sys/stat.h>
 #include <sys/syscall.h>
 #include <termios.h>
+#include <linux/stat.h>
 #elif TARGET_OS_WASI
 #include <fcntl.h>
 #include <sys/stat.h>
diff --git a/CoreFoundation/Base.subproj/module.modulemap b/CoreFoundation/Base.subproj/module.modulemap
index fe4c0a68aa..8e95a17651 100644
--- a/CoreFoundation/Base.subproj/module.modulemap
+++ b/CoreFoundation/Base.subproj/module.modulemap
@@ -1,6 +1,12 @@
 framework module CoreFoundation [extern_c] [system] {
     umbrella header "CoreFoundation.h"
     explicit module CFPlugInCOM { header "CFPlugInCOM.h" }
+    explicit module ForSwiftFoundationOnly {
+      header "ForSwiftFoundationOnly.h"
+      // Do not re-export imported Clang modules to avoid pulling in
+      // system headers like linux/stat.h whose constants might conflict
+      // with constants from the platform module.
+    }
 
     export *
     module * {
diff --git a/Sources/Foundation/CGFloat.swift b/Sources/Foundation/CGFloat.swift
index ffe3a6c6ff..c59977f88a 100644
--- a/Sources/Foundation/CGFloat.swift
+++ b/Sources/Foundation/CGFloat.swift
@@ -7,6 +7,10 @@
 // See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
 //
 
+#if canImport(Android)
+import Android
+#endif
+
 @frozen
 public struct CGFloat: Sendable {
 #if arch(i386) || arch(arm) || arch(wasm32)
diff --git a/Sources/Foundation/Data.swift b/Sources/Foundation/Data.swift
index 9e5c9faf38..57e17e58aa 100644
--- a/Sources/Foundation/Data.swift
+++ b/Sources/Foundation/Data.swift
@@ -42,6 +42,13 @@
 @usableFromInline let memset = WASILibc.memset
 @usableFromInline let memcpy = WASILibc.memcpy
 @usableFromInline let memcmp = WASILibc.memcmp
+#elseif canImport(Android)
+@usableFromInline let calloc = Android.calloc
+@usableFromInline let malloc = Android.malloc
+@usableFromInline let free = Android.free
+@usableFromInline let memset = Android.memset
+@usableFromInline let memcpy = Android.memcpy
+@usableFromInline let memcmp = Android.memcmp
 #endif
 
 #if !canImport(Darwin)
@@ -57,6 +64,8 @@ internal func malloc_good_size(_ size: Int) -> Int {
 import Glibc
 #elseif canImport(Musl)
 import Musl
+#elseif canImport(Android)
+import Android
 #elseif canImport(WASILibc)
 import WASILibc
 #endif
diff --git a/Sources/Foundation/FileHandle.swift b/Sources/Foundation/FileHandle.swift
index 72ab09a3f6..7c777254f3 100644
--- a/Sources/Foundation/FileHandle.swift
+++ b/Sources/Foundation/FileHandle.swift
@@ -34,6 +34,11 @@ import WASILibc
 fileprivate let _read = WASILibc.read(_:_:_:)
 fileprivate let _write = WASILibc.write(_:_:_:)
 fileprivate let _close = WASILibc.close(_:)
+#elseif canImport(Android)
+import Android
+fileprivate let _read = Android.read(_:_:_:)
+fileprivate let _write = Android.write(_:_:_:)
+fileprivate let _close = Android.close(_:)
 #endif
 
 #if canImport(WinSDK)
@@ -324,7 +329,7 @@ open class FileHandle : NSObject {
                 let data = mmap(nil, mapSize, PROT_READ, MAP_PRIVATE, _fd, 0)
                 // Swift does not currently expose MAP_FAILURE
                 if data != UnsafeMutableRawPointer(bitPattern: -1) {
-                    return NSData.NSDataReadResult(bytes: data!, length: mapSize) { buffer, length in
+                    return NSData.NSDataReadResult(bytes: data, length: mapSize) { buffer, length in
                         munmap(buffer, length)
                     }
                 }
diff --git a/Sources/Foundation/FileManager+POSIX.swift b/Sources/Foundation/FileManager+POSIX.swift
index 73d8171832..893917bade 100644
--- a/Sources/Foundation/FileManager+POSIX.swift
+++ b/Sources/Foundation/FileManager+POSIX.swift
@@ -7,6 +7,10 @@
 //
 #if !os(Windows)
 
+#if canImport(Android)
+import Android
+#endif
+
 #if os(Android) && (arch(i386) || arch(arm)) // struct stat.st_mode is UInt32
 internal func &(left: UInt32, right: mode_t) -> mode_t {
     return mode_t(left) & right
@@ -803,17 +807,24 @@ extension FileManager {
                 let ps = UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>.allocate(capacity: 2)
                 ps.initialize(to: UnsafeMutablePointer(mutating: fsRep))
                 ps.advanced(by: 1).initialize(to: nil)
-                let stream = fts_open(ps, FTS_PHYSICAL | FTS_XDEV | FTS_NOCHDIR | FTS_NOSTAT, nil)
+                let stream = ps.withMemoryRebound(to: UnsafeMutablePointer<CChar>.self, capacity: 2) { rebound_ps in
+#if canImport(Android)
+                    let arg = rebound_ps
+#else
+                    let arg = ps
+#endif
+                    return fts_open(arg, FTS_PHYSICAL | FTS_XDEV | FTS_NOCHDIR | FTS_NOSTAT, nil)
+                }
                 ps.deinitialize(count: 2)
                 ps.deallocate()
 
-                if stream != nil {
+                if let stream {
                     defer {
                         fts_close(stream)
                     }
 
-                    while let current = fts_read(stream)?.pointee {
-                        let itemPath = string(withFileSystemRepresentation: current.fts_path, length: Int(current.fts_pathlen))
+                    while let current = fts_read(stream)?.pointee, let fts_path = current.fts_path {
+                        let itemPath = string(withFileSystemRepresentation: fts_path, length: Int(current.fts_pathlen))
                         guard alreadyConfirmed || shouldRemoveItemAtPath(itemPath, isURL: isURL) else {
                             continue
                         }
@@ -821,11 +832,11 @@ extension FileManager {
                         do {
                             switch Int32(current.fts_info) {
                             case FTS_DEFAULT, FTS_F, FTS_NSOK, FTS_SL, FTS_SLNONE:
-                                if unlink(current.fts_path) == -1 {
+                                if unlink(fts_path) == -1 {
                                     throw _NSErrorWithErrno(errno, reading: false, path: itemPath)
                                 }
                             case FTS_DP:
-                                if rmdir(current.fts_path) == -1 {
+                                if rmdir(fts_path) == -1 {
                                     throw _NSErrorWithErrno(errno, reading: false, path: itemPath)
                                 }
                             case FTS_DNR, FTS_ERR, FTS_NS:
@@ -1171,7 +1182,14 @@ extension FileManager {
                     defer { ps.deallocate() }
                     ps.initialize(to: UnsafeMutablePointer(mutating: fsRep))
                     ps.advanced(by: 1).initialize(to: nil)
-                    return fts_open(ps, FTS_PHYSICAL | FTS_XDEV | FTS_NOCHDIR | FTS_NOSTAT, nil)
+                    return ps.withMemoryRebound(to: UnsafeMutablePointer<CChar>.self, capacity: 2) { rebound_ps in
+#if canImport(Android)
+                        let arg = rebound_ps
+#else
+                        let arg = ps
+#endif
+                        return fts_open(arg, FTS_PHYSICAL | FTS_XDEV | FTS_NOCHDIR | FTS_NOSTAT, nil)
+                    }
                 }
                 if _stream == nil {
                     throw _NSErrorWithErrno(errno, reading: true, url: url)
@@ -1218,13 +1236,13 @@ extension FileManager {
 
                 _current = fts_read(stream)
                 while let current = _current {
-                    let filename = FileManager.default.string(withFileSystemRepresentation: current.pointee.fts_path, length: Int(current.pointee.fts_pathlen))
+                    let filename = FileManager.default.string(withFileSystemRepresentation: current.pointee.fts_path!, length: Int(current.pointee.fts_pathlen))
 
                     switch Int32(current.pointee.fts_info) {
                         case FTS_D:
                             let (showFile, skipDescendants) = match(filename: filename, to: _options, isDir: true)
                             if skipDescendants {
-                                fts_set(_stream, _current, FTS_SKIP)
+                                fts_set(stream, _current!, FTS_SKIP)
                             }
                             if showFile {
                                  return URL(fileURLWithPath: filename, isDirectory: true)
@@ -1398,7 +1416,7 @@ extension FileManager {
             let finalErrno = originalItemURL.withUnsafeFileSystemRepresentation { (originalFS) -> Int32? in
                 return newItemURL.withUnsafeFileSystemRepresentation { (newItemFS) -> Int32? in
                     // This is an atomic operation in many OSes, but is not guaranteed to be atomic by the standard.
-                    if rename(newItemFS, originalFS) == 0 {
+                    if rename(newItemFS!, originalFS!) == 0 {
                         return nil
                     } else {
                         return errno
diff --git a/Sources/Foundation/FileManager.swift b/Sources/Foundation/FileManager.swift
index fdd8411511..5ce6dca8d2 100644
--- a/Sources/Foundation/FileManager.swift
+++ b/Sources/Foundation/FileManager.swift
@@ -23,6 +23,8 @@ import WinSDK
 
 #if os(WASI)
 import WASILibc
+#elseif canImport(Android)
+import Android
 #endif
 
 #if os(Windows)
@@ -579,13 +581,13 @@ open class FileManager : NSObject {
 #elseif os(WASI)
         let type = FileAttributeType(statMode: mode_t(s.st_mode))
 #else
-        if let pwd = getpwuid(s.st_uid), pwd.pointee.pw_name != nil {
-            let name = String(cString: pwd.pointee.pw_name)
+        if let pwd = getpwuid(s.st_uid), let pw_name = pwd.pointee.pw_name {
+            let name = String(cString: pw_name)
             result[.ownerAccountName] = name
         }
 
-        if let grd = getgrgid(s.st_gid), grd.pointee.gr_name != nil {
-            let name = String(cString: grd.pointee.gr_name)
+        if let grd = getgrgid(s.st_gid), let gr_name = grd.pointee.gr_name {
+            let name = String(cString: gr_name)
             result[.groupOwnerAccountName] = name
         }
 
diff --git a/Sources/Foundation/Host.swift b/Sources/Foundation/Host.swift
index b5205ebb76..dc65b35379 100644
--- a/Sources/Foundation/Host.swift
+++ b/Sources/Foundation/Host.swift
@@ -12,8 +12,9 @@
 import WinSDK
 #endif
 
-#if os(Android)
-    // Android Glibc differs a little with respect to the Linux Glibc.
+#if canImport(Android)
+    import Android
+    // Android Bionic differs a little with respect to the Linux Glibc.
 
     // IFF_LOOPBACK is part of the enumeration net_device_flags, which needs to
     // convert to UInt32.
@@ -24,8 +25,8 @@ import WinSDK
     }
 
     // getnameinfo uses size_t for its 4th and 6th arguments.
-    private func getnameinfo(_ addr: UnsafePointer<sockaddr>?, _ addrlen: socklen_t, _ host: UnsafeMutablePointer<Int8>?, _ hostlen: socklen_t, _ serv: UnsafeMutablePointer<Int8>?, _ servlen: socklen_t, _ flags: Int32) -> Int32 {
-        return Glibc.getnameinfo(addr, addrlen, host, Int(hostlen), serv, Int(servlen), flags)
+    private func getnameinfo(_ addr: UnsafePointer<sockaddr>, _ addrlen: socklen_t, _ host: UnsafeMutablePointer<Int8>?, _ hostlen: socklen_t, _ serv: UnsafeMutablePointer<Int8>?, _ servlen: socklen_t, _ flags: Int32) -> Int32 {
+        return Android.getnameinfo(addr, addrlen, host, Int(hostlen), serv, Int(servlen), flags)
     }
 
     // getifaddrs and freeifaddrs are not available in Android 6.0 or earlier, so call these functions dynamically.
diff --git a/Sources/Foundation/NSData.swift b/Sources/Foundation/NSData.swift
index aaeeb9aeca..ef755b7197 100644
--- a/Sources/Foundation/NSData.swift
+++ b/Sources/Foundation/NSData.swift
@@ -11,6 +11,9 @@
 #if !os(WASI)
 import Dispatch
 #endif
+#if canImport(Android)
+import Android
+#endif
 
 extension NSData {
     public struct ReadingOptions : OptionSet {
@@ -495,6 +498,8 @@ open class NSData : NSObject, NSCopying, NSMutableCopying, NSSecureCoding {
             let createMode = Int(Musl.S_IRUSR) | Int(Musl.S_IWUSR) | Int(Musl.S_IRGRP) | Int(Musl.S_IWGRP) | Int(Musl.S_IROTH) | Int(Musl.S_IWOTH)
 #elseif canImport(WASILibc)
             let createMode = Int(WASILibc.S_IRUSR) | Int(WASILibc.S_IWUSR) | Int(WASILibc.S_IRGRP) | Int(WASILibc.S_IWGRP) | Int(WASILibc.S_IROTH) | Int(WASILibc.S_IWOTH)
+#elseif canImport(Android)
+            let createMode = Int(Android.S_IRUSR) | Int(Android.S_IWUSR) | Int(Android.S_IRGRP) | Int(Android.S_IWGRP) | Int(Android.S_IROTH) | Int(Android.S_IWOTH)
 #endif
             guard let fh = FileHandle(path: path, flags: flags, createMode: createMode) else {
                 throw _NSErrorWithErrno(errno, reading: false, path: path)
diff --git a/Sources/Foundation/NSError.swift b/Sources/Foundation/NSError.swift
index fc87a4d648..f05b503a2e 100644
--- a/Sources/Foundation/NSError.swift
+++ b/Sources/Foundation/NSError.swift
@@ -16,6 +16,8 @@ import Darwin
 import Glibc
 #elseif canImport(CRT)
 import CRT
+#elseif canImport(Android)
+import Android
 #endif
 
 @_implementationOnly import CoreFoundation
diff --git a/Sources/Foundation/NSLock.swift b/Sources/Foundation/NSLock.swift
index 0513bfd96e..5ca93cde37 100644
--- a/Sources/Foundation/NSLock.swift
+++ b/Sources/Foundation/NSLock.swift
@@ -11,6 +11,8 @@
 
 #if canImport(Glibc)
 import Glibc
+#elseif canImport(Android)
+import Android
 #endif
 
 #if os(Windows)
diff --git a/Sources/Foundation/NSPathUtilities.swift b/Sources/Foundation/NSPathUtilities.swift
index 91e7ccba44..9e5dbd9628 100644
--- a/Sources/Foundation/NSPathUtilities.swift
+++ b/Sources/Foundation/NSPathUtilities.swift
@@ -10,6 +10,8 @@
 @_implementationOnly import CoreFoundation
 #if os(Windows)
 import WinSDK
+#elseif canImport(Android)
+import Android
 #elseif os(WASI)
 import WASILibc
 // CoreFoundation brings <errno.h> but it conflicts with WASILibc.errno
diff --git a/Sources/Foundation/NSPlatform.swift b/Sources/Foundation/NSPlatform.swift
index a18090265d..5424f5bb92 100644
--- a/Sources/Foundation/NSPlatform.swift
+++ b/Sources/Foundation/NSPlatform.swift
@@ -10,6 +10,9 @@
 #if os(macOS) || os(iOS)
 fileprivate let _NSPageSize = Int(vm_page_size)
 #elseif os(Linux) || os(Android) || os(OpenBSD)
+#if canImport(Android)
+import Android
+#endif
 fileprivate let _NSPageSize = Int(getpagesize())
 #elseif os(Windows)
 import WinSDK
diff --git a/Sources/Foundation/NSSwiftRuntime.swift b/Sources/Foundation/NSSwiftRuntime.swift
index c079ed6259..8d3305c355 100644
--- a/Sources/Foundation/NSSwiftRuntime.swift
+++ b/Sources/Foundation/NSSwiftRuntime.swift
@@ -18,6 +18,8 @@
 @_exported import Glibc
 #elseif canImport(Musl)
 @_exported import Musl
+#elseif canImport(Bionic)
+@_exported import Bionic
 #elseif os(WASI)
 @_exported import WASILibc
 #elseif os(Windows)
diff --git a/Sources/Foundation/NSURL.swift b/Sources/Foundation/NSURL.swift
index 4d31e2ba9c..6169613b29 100644
--- a/Sources/Foundation/NSURL.swift
+++ b/Sources/Foundation/NSURL.swift
@@ -22,6 +22,8 @@ import Darwin
 import Glibc
 #elseif canImport(Musl)
 import Musl
+#elseif canImport(Android)
+import Android
 #endif
 
 // NOTE: this represents PLATFORM_PATH_STYLE
diff --git a/Sources/Foundation/Port.swift b/Sources/Foundation/Port.swift
index c53263f0ef..9f1823fe90 100644
--- a/Sources/Foundation/Port.swift
+++ b/Sources/Foundation/Port.swift
@@ -90,22 +90,28 @@ open class SocketPort: Port {}
 
 #else
 
-#if canImport(Glibc) && !os(Android) && !os(OpenBSD)
+#if canImport(Glibc) && !os(OpenBSD)
 import Glibc
 fileprivate let SOCK_STREAM = Int32(Glibc.SOCK_STREAM.rawValue)
 fileprivate let SOCK_DGRAM  = Int32(Glibc.SOCK_DGRAM.rawValue)
 fileprivate let IPPROTO_TCP = Int32(Glibc.IPPROTO_TCP)
 #endif
 
-#if canImport(Glibc) && os(Android) || os(OpenBSD)
+#if canImport(Glibc) && os(OpenBSD)
 import Glibc
 fileprivate let SOCK_STREAM = Int32(Glibc.SOCK_STREAM)
 fileprivate let SOCK_DGRAM  = Int32(Glibc.SOCK_DGRAM)
 fileprivate let IPPROTO_TCP = Int32(Glibc.IPPROTO_TCP)
 fileprivate let INADDR_ANY: in_addr_t = 0
-#if os(OpenBSD)
 fileprivate let INADDR_LOOPBACK = 0x7f000001
 #endif
+
+#if canImport(Android)
+import Android
+fileprivate let SOCK_STREAM = Int32(Android.SOCK_STREAM)
+fileprivate let SOCK_DGRAM  = Int32(Android.SOCK_DGRAM)
+fileprivate let IPPROTO_TCP = Int32(Android.IPPROTO_TCP)
+fileprivate let INADDR_ANY: in_addr_t = 0
 #endif
 
 
diff --git a/Sources/Foundation/Process.swift b/Sources/Foundation/Process.swift
index 0f32045e49..ee90279021 100644
--- a/Sources/Foundation/Process.swift
+++ b/Sources/Foundation/Process.swift
@@ -18,6 +18,8 @@ import struct WinSDK.HANDLE
 
 #if canImport(Darwin)
 import Darwin
+#elseif canImport(Android)
+import Android
 #endif
 
 extension Process {
@@ -928,6 +930,13 @@ open class Process: NSObject {
         var spawnAttrs: posix_spawnattr_t? = nil
 #else
         var spawnAttrs: posix_spawnattr_t = posix_spawnattr_t()
+#endif
+#if os(Android)
+        guard var spawnAttrs else {
+            throw NSError(domain: NSPOSIXErrorDomain, code: Int(errno), userInfo: [
+                    NSURLErrorKey:self.executableURL!
+            ])
+        }
 #endif
         try _throwIfPosixError(posix_spawnattr_init(&spawnAttrs))
         try _throwIfPosixError(posix_spawnattr_setflags(&spawnAttrs, .init(POSIX_SPAWN_SETPGROUP)))
diff --git a/Sources/Foundation/Thread.swift b/Sources/Foundation/Thread.swift
index 166a5d3fe5..4f401987b4 100644
--- a/Sources/Foundation/Thread.swift
+++ b/Sources/Foundation/Thread.swift
@@ -17,6 +17,8 @@ import WinSDK
 import Glibc
 #elseif canImport(Musl)
 import Musl
+#elseif canImport(Android)
+import Android
 #endif
 
 // WORKAROUND_SR9811
diff --git a/Sources/FoundationNetworking/HTTPCookie.swift b/Sources/FoundationNetworking/HTTPCookie.swift
index 0534780e7b..33519e41b2 100644
--- a/Sources/FoundationNetworking/HTTPCookie.swift
+++ b/Sources/FoundationNetworking/HTTPCookie.swift
@@ -15,6 +15,8 @@ import Foundation
 
 #if os(Windows)
 import WinSDK
+#elseif canImport(Android)
+import Android
 #endif
 
 public struct HTTPCookiePropertyKey : RawRepresentable, Equatable, Hashable {
diff --git a/Sources/Tools/plutil/main.swift b/Sources/Tools/plutil/main.swift
index d71d9ba9a2..bc35a1720d 100644
--- a/Sources/Tools/plutil/main.swift
+++ b/Sources/Tools/plutil/main.swift
@@ -15,6 +15,9 @@ import Glibc
 #elseif canImport(Musl)
 import Foundation
 import Musl
+#elseif canImport(Android)
+import Foundation
+import Android
 #elseif canImport(CRT)
 import Foundation
 import CRT
diff --git a/Tests/Foundation/FTPServer.swift b/Tests/Foundation/FTPServer.swift
index 8bb4a9d779..a09fcae5f3 100644
--- a/Tests/Foundation/FTPServer.swift
+++ b/Tests/Foundation/FTPServer.swift
@@ -15,6 +15,8 @@ import Dispatch
     import Glibc
 #elseif canImport(Darwin)
     import Darwin
+#elseif canImport(Android)
+    import Android
 #endif
 
 public class ServerSemaphore {
diff --git a/Tests/Foundation/HTTPServer.swift b/Tests/Foundation/HTTPServer.swift
index 5af9fb9c52..4616a3f6ab 100644
--- a/Tests/Foundation/HTTPServer.swift
+++ b/Tests/Foundation/HTTPServer.swift
@@ -21,6 +21,8 @@ import Dispatch
     import Darwin
 #elseif canImport(Glibc)
     import Glibc
+#elseif canImport(Android)
+    import Android
 #endif
 
 #if !os(Windows)
diff --git a/Tests/Foundation/Tests/TestFileHandle.swift b/Tests/Foundation/Tests/TestFileHandle.swift
index 5416c41c4e..0ff23a595b 100644
--- a/Tests/Foundation/Tests/TestFileHandle.swift
+++ b/Tests/Foundation/Tests/TestFileHandle.swift
@@ -19,6 +19,8 @@
 import Dispatch
 #if os(Windows)
 import WinSDK
+#elseif canImport(Android)
+import Android
 #endif
 
 class TestFileHandle : XCTestCase {
@@ -111,7 +113,7 @@ class TestFileHandle : XCTestCase {
 #else
         var fds: [Int32] = [-1, -1]
         fds.withUnsafeMutableBufferPointer { (pointer) -> Void in
-            pipe(pointer.baseAddress)
+            pipe(pointer.baseAddress!)
         }
         
         close(fds[1])
diff --git a/Tests/Foundation/Tests/TestNSData.swift b/Tests/Foundation/Tests/TestNSData.swift
index 2c84f63360..2279819805 100644
--- a/Tests/Foundation/Tests/TestNSData.swift
+++ b/Tests/Foundation/Tests/TestNSData.swift
@@ -17,6 +17,10 @@ import CoreFoundation
     #endif
 #endif
 
+#if canImport(Android)
+import Android
+#endif
+
 class TestNSData: LoopbackServerTest {
     
     class AllOnesImmutableData : NSData {
@@ -589,6 +593,8 @@ class TestNSData: LoopbackServerTest {
                 let permission = try fileManager._permissionsOfItem(atPath: url.path)
 #if canImport(Darwin)
                 let expected = Int(S_IRUSR) | Int(S_IWUSR) | Int(S_IRGRP) | Int(S_IWGRP) | Int(S_IROTH) | Int(S_IWOTH)
+#elseif canImport(Android)
+                let expected = Int(Android.S_IRUSR) | Int(Android.S_IWUSR) | Int(Android.S_IRGRP) | Int(Android.S_IWGRP) | Int(Android.S_IROTH) | Int(Android.S_IWOTH)
 #else
                 let expected = Int(Glibc.S_IRUSR) | Int(Glibc.S_IWUSR) | Int(Glibc.S_IRGRP) | Int(Glibc.S_IWGRP) | Int(Glibc.S_IROTH) | Int(Glibc.S_IWOTH)
 #endif
@@ -612,6 +618,8 @@ class TestNSData: LoopbackServerTest {
                 let permission = try fileManager._permissionsOfItem(atPath: url.path)
 #if canImport(Darwin)
                 let expected = Int(S_IRUSR) | Int(S_IWUSR) | Int(S_IRGRP) | Int(S_IWGRP) | Int(S_IROTH) | Int(S_IWOTH)
+#elseif canImport(Android)
+                let expected = Int(Android.S_IRUSR) | Int(Android.S_IWUSR) | Int(Android.S_IRGRP) | Int(Android.S_IWGRP) | Int(Android.S_IROTH) | Int(Android.S_IWOTH)
 #else
                 let expected = Int(Glibc.S_IRUSR) | Int(Glibc.S_IWUSR) | Int(Glibc.S_IRGRP) | Int(Glibc.S_IWGRP) | Int(Glibc.S_IROTH) | Int(Glibc.S_IWOTH)
 #endif
diff --git a/Tests/Foundation/Tests/TestProcess.swift b/Tests/Foundation/Tests/TestProcess.swift
index 642456d541..86444cc88d 100644
--- a/Tests/Foundation/Tests/TestProcess.swift
+++ b/Tests/Foundation/Tests/TestProcess.swift
@@ -7,6 +7,10 @@
 // See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
 //
 
+#if canImport(Android)
+import Android
+#endif
+
 class TestProcess : XCTestCase {
     
     func test_exit0() throws {
diff --git a/Tests/Foundation/Tests/TestSocketPort.swift b/Tests/Foundation/Tests/TestSocketPort.swift
index 32366ea510..454fbfd511 100644
--- a/Tests/Foundation/Tests/TestSocketPort.swift
+++ b/Tests/Foundation/Tests/TestSocketPort.swift
@@ -8,6 +8,8 @@
 //
 #if os(Windows)
 import WinSDK
+#elseif canImport(Android)
+import Android
 #endif
 
 class TestPortDelegateWithBlock: NSObject, PortDelegate {
diff --git a/Tests/Foundation/Tests/TestTimeZone.swift b/Tests/Foundation/Tests/TestTimeZone.swift
index 5e15c00026..373e21b263 100644
--- a/Tests/Foundation/Tests/TestTimeZone.swift
+++ b/Tests/Foundation/Tests/TestTimeZone.swift
@@ -160,7 +160,7 @@ class TestTimeZone: XCTestCase {
         var lt = tm()
         localtime_r(&t, &lt)
         let zoneName = NSTimeZone.system.abbreviation() ?? "Invalid Abbreviation"
-        let expectedName = String(cString: lt.tm_zone, encoding: .ascii) ?? "Invalid Zone"
+        let expectedName = String(cString: lt.tm_zone!, encoding: .ascii) ?? "Invalid Zone"
         XCTAssertEqual(zoneName, expectedName, "expected name \"\(expectedName)\" is not equal to \"\(zoneName)\"")
     }
 #endif
diff --git a/Tests/Foundation/Tests/TestURL.swift b/Tests/Foundation/Tests/TestURL.swift
index b0d90812d8..ab3ea47842 100644
--- a/Tests/Foundation/Tests/TestURL.swift
+++ b/Tests/Foundation/Tests/TestURL.swift
@@ -7,6 +7,10 @@
 // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
 //
 
+#if canImport(Android)
+import Android
+#endif
+
 let kURLTestParsingTestsKey = "ParsingTests"
 
 let kURLTestTitleKey = "In-Title"
diff --git a/Tests/Foundation/main.swift b/Tests/Foundation/main.swift
index e6c7b35bc1..643c0c120c 100644
--- a/Tests/Foundation/main.swift
+++ b/Tests/Foundation/main.swift
@@ -13,6 +13,8 @@
     import Darwin
 #elseif canImport(Glibc)
     import Glibc
+#elseif canImport(Android)
+    import Android
 #elseif canImport(CRT)
     import CRT
 #endif
diff --git a/Tests/Tools/XDGTestHelper/main.swift b/Tests/Tools/XDGTestHelper/main.swift
index d2a36e2b11..6d43cd17a2 100644
--- a/Tests/Tools/XDGTestHelper/main.swift
+++ b/Tests/Tools/XDGTestHelper/main.swift
@@ -19,6 +19,8 @@ import FoundationNetworking
 #endif
 #if os(Windows)
 import WinSDK
+#elseif os(Android)
+import Android
 #endif
 
 enum HelperCheckStatus : Int32 {