|
| 1 | +--- |
| 2 | +layout: new-layouts/post |
| 3 | +published: true |
| 4 | +date: 2025-12-18 10:00:00 |
| 5 | +title: "Exploring the Swift SDK for Android" |
| 6 | +author: android-workgroup |
| 7 | +category: "Developer Tools" |
| 8 | +--- |
| 9 | + |
| 10 | +Since the announcement of [the preview Swift SDK for Android](/blog/nightly-swift-sdk-for-android/), |
| 11 | +the Android workgroup has seen a lot of interest in how it works and what's next. |
| 12 | +Please read on for some answers to common questions about the technology and its |
| 13 | +future, and try out the new Swift 6.3 SDK nightly previews. |
| 14 | + |
| 15 | +## How Swift works on Android |
| 16 | + |
| 17 | +Swift compiles directly to native machine code on Android, the same way it does on most |
| 18 | +other platforms. This approach produces similar performance to C and C++ code built using the |
| 19 | +Android Native Development Kit (NDK), while achieving a happier balance between performance, |
| 20 | +safety, and usability. To make this possible, Swift apps on Android bundle a native runtime |
| 21 | +that implements many of its features, including its standard library and core |
| 22 | +libraries, like Dispatch and [Foundation](/blog/foundation-preview-now-available/). |
| 23 | + |
| 24 | +However, since most Android APIs are only made available through Java and Kotlin, |
| 25 | +Swift must call into the Android Runtime (ART); that's where the [Java interoperability |
| 26 | +project's](https://github.com/swiftlang/swift-java) `jextract` and `wrap-java` |
| 27 | +tools come in. These tools automatically create bindings that enable you to call |
| 28 | +Swift from Java or go the other way using the Java Native Interface (JNI), which |
| 29 | +allows Swift to seamlessly integrate with the Android platform. |
| 30 | + |
| 31 | +The [`jextract` tool gained a JNI mode this summer](/blog/gsoc-2025-showcase-swift-java/): |
| 32 | +you can watch its author Mads Odgaard's [Server-Side Swift Conference talk](https://www.youtube.com/watch?v=tOH6V1IvTAc) |
| 33 | +and try out the [example weather app](https://github.com/swiftlang/swift-android-examples/tree/main/swift-java-weather-app) he submitted in the Android examples repository. |
| 34 | + |
| 35 | +## Swift on Android in production |
| 36 | + |
| 37 | +While work is still ongoing on official Java interoperability, Android apps built using Swift |
| 38 | +have been in production for many years employing homegrown Java interop, with these apps |
| 39 | +collectively downloaded millions of times. Here are some notable examples: |
| 40 | + |
| 41 | +- [Spark](https://play.google.com/store/apps/details?id=com.readdle.spark) - A popular email client using Swift to share code between mobile iOS/Android and desktop macOS/Windows versions |
| 42 | +- [flowkey](https://play.google.com/store/apps/details?id=com.flowkey.app) - An interactive piano learning app built with Swift for Android for almost a decade |
| 43 | +- [MediQuo](https://play.google.com/store/apps/details?id=com.mediquo.main) - A healthcare app leveraging Swift for cross-platform development |
| 44 | +- [Naturitas](https://play.google.com/store/apps/details?id=com.naturitas.android) - An organic products marketplace running Swift in production |
| 45 | + |
| 46 | +## Ongoing work |
| 47 | + |
| 48 | +Grassroots community efforts to run Swift on Android [began as soon as the language source was opened in 2015](https://lists.swift.org/pipermail/swift-dev/Week-of-Mon-20151207/000171.html), |
| 49 | +and continue to this day. The [Android project board](https://github.com/orgs/swiftlang/projects/17) lists areas the workgroup determines important, |
| 50 | +such as easy debugging, now a high priority for us. While it [may work for small examples](https://github.com/swiftlang/llvm-project/issues/10831), |
| 51 | +we need to expand and test it more and make it easy to configure and access. That will likely |
| 52 | +mean tying the debugger and Swift Language Server Protocol tool, [sourcekit-lsp](/blog/gsoc-2025-showcase-code-completion/), |
| 53 | +into Integrated Development Environments (IDEs) like [Visual Studio Code](/blog/gsoc-2025-showcase-swiftly-support-in-vscode/) |
| 54 | +and Android Studio, another issue on our board. |
| 55 | + |
| 56 | +[An Android workflow](https://github.com/swiftlang/github-workflows/pull/172) was |
| 57 | +added to the official Swift workflows for GitHub months ago, allowing you to easily |
| 58 | +try building your Swift packages with the Swift SDK for Android, and work is underway to let you |
| 59 | +[run your tests in an Android emulator](https://github.com/swiftlang/github-workflows/pull/215) |
| 60 | +too. |
| 61 | + |
| 62 | +We are looking to onboard more contributors and have set up a [video call this |
| 63 | +weekend](https://forums.swift.org/t/swift-on-android-new-contributors-call/83729) to discuss getting started. |
| 64 | +We hope to make these contributor calls a recurring event moving forward, as more people |
| 65 | +pitch in to improve these Swift tools themselves. |
| 66 | + |
| 67 | +## Sharing Swift across platforms: logic vs UI |
| 68 | + |
| 69 | +Swift allows you to target many platforms with the same business logic, and Swift |
| 70 | +on Android expands that much more. |
| 71 | +As we shared in [our draft vision document](https://github.com/swiftlang/swift-evolution/blob/807b844be42db582e434d1667fc907ae7a7a8775/visions/android.md), |
| 72 | + a prominent use case we’re focused on is sharing core business logic, algorithms, and data models across applications. |
| 73 | +The workgroup is not providing a single GUI solution, however a number of nascent community projects have approached the challenge in different ways. |
| 74 | + |
| 75 | +Our [recent post in the Swift forums](https://forums.swift.org/t/swift-gui-toolkits-for-android/83337) |
| 76 | +lists a handful of popular and in-progress options. |
| 77 | +While the workgroup has not validated the claims on individual projects, we plan to add |
| 78 | +more info on using compatible GUI tools with the Swift SDK for Android in the coming months. |
| 79 | + |
| 80 | +## Android API versioning |
| 81 | + |
| 82 | +Until recently, Swift on Android did not support targeting multiple Android API levels |
| 83 | +in the same app, but recent preview releases bring the familiar `@available` |
| 84 | +attribute and `#available` runtime check that you know from Apple platforms to Android: |
| 85 | + |
| 86 | +```swift |
| 87 | +#if canImport(Android) |
| 88 | +import Android |
| 89 | +import Dispatch |
| 90 | +#endif |
| 91 | + |
| 92 | +@available(Android 33, *) |
| 93 | +func backtrace() { |
| 94 | + withUnsafeTemporaryAllocation(of: UnsafeMutableRawPointer.self, capacity: 1) { address in |
| 95 | + _ = backtrace(address.baseAddress!, 1) |
| 96 | + } |
| 97 | +} |
| 98 | + |
| 99 | +@main |
| 100 | +struct ExecutableDemo { |
| 101 | + static func main() { |
| 102 | + #if os(Android) |
| 103 | + print("Hello from Android API 28 or later") |
| 104 | + if #available(Android 33, *) { |
| 105 | + // The following code is only run on Android 33+ devices. |
| 106 | + backtrace() |
| 107 | + print("Hello from Android API 33+") |
| 108 | + } |
| 109 | + #endif |
| 110 | + } |
| 111 | +} |
| 112 | +``` |
| 113 | +Try this new feature on Android and let us know how it works for you. |
| 114 | + |
| 115 | +## Learn from the community |
| 116 | + |
| 117 | +Those using Swift on Android for many years have been sharing their experiences, |
| 118 | +as founding contributors like [Readdle](https://readdle.com/blog/swift-for-android-our-experience-and-tools) |
| 119 | +and [flowkey](https://medium.com/@ephemer/why-we-put-an-app-in-the-android-play-store-using-swift-96ac87c88dfc) |
| 120 | +have written about their work for the last decade. |
| 121 | + |
| 122 | +The Left Bit's Pierluigi Cifani [recently wrote about their experiences](https://forums.swift.org/t/thoughts-on-swift-for-android/80961), |
| 123 | +gave [a great talk at NSSpain 2025 a couple months ago](https://youtu.be/EIGl6GOo210), |
| 124 | +and was [interviewed by Swift Toolkit last month](https://www.swifttoolkit.dev/posts/dc-pier). |
| 125 | + |
| 126 | +A [community member recently contributed an example app](https://github.com/swiftlang/swift-android-examples/tree/main/hello-cpp-swift) |
| 127 | +that builds C++ using CMake and links it with Swift, using Swift's automated JNI bridging |
| 128 | +to Java instead. |
| 129 | + |
| 130 | +## Swift 6.3 SDK nightly previews |
| 131 | + |
| 132 | +Finally, we are happy to announce that [an official Swift 6.3 SDK CI](https://ci.swift.org/job/oss-swift-6.3-package-swift-sdk-for-android/) |
| 133 | +has been set up, and it is producing [nightly preview releases of the Swift 6.3 SDK for Android](/install/macos/#swift-sdk-buindles-dev). |
| 134 | +Please follow the [Getting Started guide](/documentation/articles/swift-sdk-for-android-getting-started.html) |
| 135 | +to install and use it. |
| 136 | + |
| 137 | +Swift on Android has been a community effort for the last decade, growing |
| 138 | +from that initial patch to apps in production and an active group of developers. |
| 139 | +Try out the new preview releases of the Swift 6.3 SDK for Android and help us |
| 140 | +make it even better! |
0 commit comments