Commissioned, Curated and Published by Russ. Researched and written with AI.


What’s New This Week

Swift 6.3 was released on March 24, 2026, marking the first official Swift SDK for Android. The release also ships the @c attribute for cleaner C interoperability (formalising the old unofficial @_cdecl), a range of Embedded Swift improvements including LLDB debugging upgrades and a diamond-dependency duplicate symbol fix, and a preview of the unified Swift Build system integrated into Swift Package Manager.


Changelog

DateSummary
26 Mar 2026Initial publication.

Swift has been open-source since 2015. Since then it has expanded from iOS and macOS to Linux, Windows, and bare-metal microcontrollers. Each of those expansions was either gradual or community-driven. The Android SDK is different: it is the first time the Swift project has shipped an official, versioned SDK for Android as part of a mainline release. Not a nightly preview. Not a community fork. A supported artifact in Swift 6.3.

That distinction matters more than the technical details alone.

What the Android SDK Actually Is

The Swift SDK for Android is a cross-compilation SDK. You compile Swift code on a macOS or Linux host machine and produce binaries that run on Android. The SDK is not a framework that wraps the Android UI layer – it does not give you SwiftUI on Android. What it gives you is the ability to write Swift modules, compile them to shared libraries for each supported architecture, and call into them from a Kotlin or Java Android app through JNI.

The supported architectures in Swift 6.3 are x86_64 (for emulators) and aarch64 (for physical devices). The minimum Android API level is 28 – Android 9.0 (Pie) – based on the build targets documented in the official getting-started guide: x86_64-unknown-linux-android28 and aarch64-unknown-linux-android28.

The Android NDK is a required dependency. Specifically, LTS version 27d or later. The SDK uses the NDK’s clang and lld for the final linking step. Setup is straightforward: install the Swift 6.3 open-source toolchain, install the SDK artifact, point the NDK at it, and you can cross-compile a Swift package for Android with a single swift build --swift-sdk invocation.

The JNI integration path comes in two flavours. The lower-level swift-java-jni-core handles raw JNI bindings. The higher-level swift-java library provides a more ergonomic interoperability layer for calling between Swift and Kotlin/Java. For teams already shipping an Android app in Kotlin who want to pull in shared Swift logic, this is the integration point.

One thing the release does not change: you still write your Android UI in Kotlin or Java. The Swift SDK for Android is not a cross-platform UI toolkit. If you want a single UI codebase across iOS and Android, you are still looking at Flutter, React Native, or Kotlin Multiplatform. What Swift 6.3 enables is sharing the logic layer – networking, business rules, algorithms, data models – in Swift, with native UI on both ends.

Why “Official” Matters

Before this release, using Swift on Android was possible through community toolchains, most notably the Readdle and broader community work that has been ongoing for years. The Swift blog post on the 6.3 release explicitly acknowledges this: the Android Workgroup’s work “built on many years of grassroots community work” to bring the SDK from nightly previews to an official release.

The difference between community tooling and an official SDK is not just optics. It means:

  • Version-pinned, reproducible builds. The SDK version is tied to the Swift toolchain version. You install swift-6.3-RELEASE and the matching Android SDK artifact – and you know exactly what you are building against.
  • Checksum-verified downloads. The official SDK install command includes a --checksum flag for verifying archive integrity.
  • Long-term support posture. An officially supported SDK gets bug fixes and updates through the standard Swift release process rather than relying on maintainers outside the core project.
  • CI integration becomes routine. Teams can confidently set up Android cross-compilation in CI without depending on an external project that may fall behind.

None of this was impossible before. But it required more ongoing maintenance and more tolerance for rough edges. Official support removes that friction layer.

The @c Attribute: Cleaning Up C Interop

Swift has had C interoperability since its early days, but the mechanism for going the other direction – exposing Swift functions to C – relied on an unofficial attribute called @_cdecl. The leading underscore was always a signal: here be dragons, this may change.

Swift 6.3 ships SE-0495, which introduces the @c attribute as the official, stable replacement. The basic usage is straightforward:

@c
func callFromC() { ... }

This generates a corresponding C declaration in the Swift-generated header file, which you can include in C or C++ code:

void callFromC(void);

You can provide a custom name for namespacing:

@c(MyLibrary_callFromC)
func callFromC() { ... }

The more interesting use case is @c combined with @implementation. If you have an existing C header that declares a function, you can provide a Swift implementation and the compiler will validate that your Swift signature matches the C declaration. This is the pattern for replacing a C library with a Swift implementation without changing anything for C clients:

// Existing C header
void process_data(const double *values, size_t count);
// Swift implementation
@c @implementation
func process_data(_ values: UnsafePointer<Double>, _ count: Int) { ... }

Beyond the naming change, @c fixes a long-standing compiler issue with nullability and sendability annotations. Previously, subtle differences between how the Swift and C sides declared a function could produce confusing “deserialization” errors at compile time. The compiler now keeps the two views of a declaration separate and only complains when the underlying C declarations are genuinely inconsistent.

For embedded and systems engineers who need tight Swift-to-C integration, this is an unambiguous improvement. The unofficial workaround worked, but the new attribute removes the “unofficial” caveat and handles edge cases that previously required workarounds.

Embedded Swift: What Changed in 6.3

Embedded Swift is the subset of Swift for resource-constrained environments: microcontrollers, bare-metal targets, anything where a full runtime is too expensive. It has been evolving rapidly. Swift 6.3 ships a set of concrete improvements worth noting.

Debugging. LLDB support for Embedded Swift has improved significantly. The memory read command now accepts a Swift type name, letting you interpret an arbitrary address as a named Swift type. Backtrace support for ARM Cortex-M (armv7m) exception frames was broken in a specific way – exception frames would often be missing one or more real frames from the call stack. This is now fixed. For anyone debugging crashes on embedded hardware, this is a meaningful quality-of-life improvement.

Diamond dependency duplicate symbols. Embedded Swift’s compilation model delays code generation, which created a concrete problem: if a dependency graph formed a diamond (A depends on B and C, both of which depend on D), symbols from D would be emitted twice and cause linker errors. The fix is that the Swift compiler now emits symbols from imported modules using weak definitions, allowing the linker to deduplicate them. This eliminates the need for the workaround flags -mergeable-symbols and -emit-empty-object-file.

SE-0492: @section and @used. Two new attributes for controlling linker section placement and symbol retention. @section specifies which linker section a global variable lands in, with #if objectFormat(...) support to handle ELF vs MachO vs COFF naming differences. @used tells the compiler not to dead-strip a symbol even if it appears unused. Both are standard tools in embedded C; having them in Swift makes the language more capable in linker-controlled environments.

SE-0497: @export. A new attribute for controlling function visibility in Embedded Swift libraries. @export(implementation) makes a function’s implementation available to clients for inlining and specialization. @export(interface) hides the implementation and emits only a callable symbol – the standard pattern for shipping a library with a stable ABI.

Swift MMIO 0.1.x. The Swift MMIO package for memory-mapped I/O shipped its 0.1 release alongside Swift 6.3, with an svd2swift tool that generates Swift MMIO interfaces directly from CMSIS SVD files – the standard hardware description format used across ARM Cortex-M toolchains. If you are writing Swift firmware for hardware described by an SVD file, this automates the register access layer.

EmbeddedRestrictions diagnostic group. A new opt-in set of compiler warnings that flags Swift constructs not available in Embedded mode, such as untyped throws or calling generic functions on existential values. Enabled by default in Embedded Swift builds, and available in standard Swift builds via a compiler flag. Useful for library authors who want to maintain Embedded Swift compatibility.

Who Should Care

iOS-native teams building the same logic twice. If your iOS app has a business logic layer you are currently reimplementing in Kotlin for Android, this is the scenario the Swift Android SDK is designed for. Write the shared logic in Swift, compile it as a shared library, call it from your existing Android app via JNI. You keep native UI on both platforms and stop maintaining two implementations of the same algorithms. The integration work is real but it is a one-time setup cost.

Teams evaluating cross-platform approaches. Flutter and React Native give you cross-platform UI at the cost of abstracting away native APIs. KMM gives you shared Kotlin logic with native UI. Swift 6.3’s Android SDK gives you a similar pattern to KMM but in Swift. If your team already has significant Swift investment and little desire to add Kotlin to the stack, this is now a genuine option rather than a community experiment.

Embedded and IoT teams. The Embedded Swift improvements in 6.3 are incremental but consistent. The diamond dependency fix, the @section and @used attributes, and the MMIO tooling all reduce friction for writing production firmware in Swift. If you are evaluating Swift for a microcontroller project, 6.3 is a more polished target than earlier releases.

Library authors with C-facing APIs. The @c attribute is the specific improvement here. If you are shipping a Swift library that needs to expose a C interface – for FFI, for legacy system integration, or for embedding in a C-calling environment – the new attribute gives you a stable, validated mechanism where previously you had an unofficial workaround.

What Is Still Missing

The Android SDK does not remove the need for Android-specific knowledge. You still need to understand the APK packaging model, the JNI calling conventions, and how Android manages library loading. The Swift toolchain does not abstract any of that away – it handles compilation and linking, and leaves the rest to you.

There is no SwiftUI for Android. The examples in the official repository demonstrate command-line executables and JNI-integrated libraries. Full native Android application development in Swift, without touching Kotlin or Java at all, is not what this SDK delivers.

The documentation is sparse relative to the iOS ecosystem. The getting-started guide covers the basics but the coverage of integrating Swift libraries into a full Android application is limited to repository examples. That will improve over time, but right now the learning curve for teams new to Android NDK development is real.

Performance benchmarks comparing Swift Android binaries against equivalent Kotlin or Rust code are not present in the release materials. The Android Workgroup has not published comparative data. This is worth watching as the SDK matures and the community produces real-world results.

The Broader Signal

Swift has always had the ambition to be a language for the entire stack – the official framing from the 6.3 release post is that Swift is “the language you reach for at every layer of the software stack.” Embedded firmware, internet-scale services, mobile apps. The Android SDK, the Embedded Swift improvements, and the C interop work in 6.3 are all steps in the same direction.

The Android SDK specifically represents a shift in what the Swift project is willing to support. Until now, Android was a community concern. With 6.3, it is a first-class supported platform. That creates a different dynamic for engineering teams evaluating Swift for new projects: the question is no longer whether Android support exists, but how mature it is. The answer in 6.3 is: solid enough to start, with obvious room to grow.

For iOS-native teams, the practical implication is worth sitting with. The constraint that drove many teams toward React Native or Flutter – the inability to share code between iOS and Android without leaving the Apple ecosystem – now has an official Swift answer. It is not the same as “just works,” but it is real.


Sources: Swift 6.3 Release Post | Getting Started with the Swift SDK for Android | Embedded Swift Improvements in Swift 6.3