この記事の要点
- プレビュー版の Swift SDK for Android の発表後によく寄せられた疑問に、Android workgroup が答える記事です。Swift が Android 上でどう動くのか、すでに実運用でどう使われているのか、現在進行中の作業、そして今後の方向性を扱っています。
- Android でも Swift は他の多くのプラットフォームと同じく ネイティブな機械語に直接コンパイル され、NDK で書いた C / C++ に近い性能を、より高い安全性と使い勝手とともに得られます。標準ライブラリや Dispatch、Foundation などを実装したネイティブランタイムをアプリに同梱して実現します。
- ほとんどの Android API は Java / Kotlin 経由でしか提供されないため、Swift は Android Runtime(ART)を呼び出す必要があります。ここで swift-java プロジェクトの
jextract/wrap-javaツールが、JNI(Java Native Interface)を介した双方向のバインディングを自動生成します。 - 直近のプレビューでは、Apple プラットフォームでおなじみの
@available属性と#availableチェックが Android でも使えるようになり、同一アプリ内で複数の Android API レベルをターゲットにできるようになりました。あわせて Swift 6.3 SDK の nightly プレビュー の配布も始まりました。
Swift は Android 上でどう動くのか
Android でも Swift は、他の多くのプラットフォームと同様にネイティブな機械語へ直接コンパイルされます。これにより、Android NDK(Native Development Kit)でビルドした C / C++ コードに近い性能を保ちつつ、性能・安全性・使い勝手のバランスをより良く取れます。これを可能にするため、Android 上の Swift アプリには、標準ライブラリや Dispatch、Foundation といったコアライブラリの機能を実装したネイティブランタイムが同梱されます。
一方で、ほとんどの Android API は Java と Kotlin 経由でしか提供されないため、Swift は Android Runtime(ART)を呼び出す必要があります。そこで登場するのが swift-java(Java 相互運用プロジェクト)の jextract / wrap-java ツールです。これらは JNI(Java Native Interface)を介して、Java から Swift を呼ぶ、あるいは逆方向に Swift から Java を呼ぶためのバインディングを自動生成し、Swift を Android プラットフォームへ統合します。
jextract ツールには 2025 年夏に JNI モード が追加されました。この成果については GSoC 2025 ショーケース: Swift/Java 相互運用の拡張 でも紹介されています。
すでに実運用されている Swift on Android
公式の Java 相互運用の整備が進む一方で、独自の Java 相互運用を使った Swift 製の Android アプリは何年も前から実運用されており、累計で数百万回ダウンロードされています。記事では次のような例が挙げられています。
- Spark — iOS / Android のモバイルと macOS / Windows のデスクトップとでコードを共有するメールクライアント
- flowkey — Swift for Android で 10 年近く開発されているピアノ学習アプリ
- MediQuo — Swift をクロスプラットフォーム開発に活用するヘルスケアアプリ
- Naturitas — Swift を本番運用しているオーガニック製品のマーケットプレイス
進行中の作業
Android 上で Swift を動かすコミュニティの草の根の取り組みは、2015 年に言語のソースが公開された直後から始まり、今も続いています。Android プロジェクトボードには workgroup が重要と判断した領域が並んでおり、現在の優先度が高い項目の 1 つが 手軽なデバッグ です。小さな例では動く場合があるものの、設定とアクセスを容易にするにはさらなる拡張とテストが必要で、デバッガや Swift の Language Server である sourcekit-lsp を Visual Studio Code や Android Studio などの IDE に組み込む作業が想定されています。
GitHub 向けの公式 Swift ワークフローには、数か月前に Android ワークフロー が追加され、Swift SDK for Android を使った Swift パッケージのビルドを手軽に試せるようになりました。さらに、Android エミュレータ上でテストを実行できるようにする作業も進められています。
workgroup はより多くのコントリビューターを迎え入れようとしており、参加を希望する人向けのビデオ通話なども企画されています。
プラットフォームをまたいだコード共有: ロジックと UI
Swift は同じビジネスロジックで多くのプラットフォームをターゲットにでき、Swift on Android はその範囲をさらに広げます。draft vision document でも述べられているとおり、workgroup が重視している代表的なユースケースは、コアとなるビジネスロジック・アルゴリズム・データモデルをアプリ間で共有する ことです。
一方で、workgroup は単一の GUI ソリューションを提供する立場は取っていません。GUI については、いくつかの萌芽的なコミュニティプロジェクトがそれぞれ異なるアプローチで取り組んでおり、Swift フォーラムの投稿に候補が挙げられています。workgroup は各プロジェクトの主張を検証してはいないものの、今後数か月のうちに、互換性のある GUI ツールを Swift SDK for Android と組み合わせて使う方法について、より多くの情報を追加する予定です。
Android API のバージョニング
これまで Swift on Android は、同一アプリ内で複数の Android API レベルをターゲットにすることをサポートしていませんでした。直近のプレビューでは、Apple プラットフォームでおなじみの @available 属性と #available ランタイムチェックが Android にも導入されています。
#if canImport(Android)
import Android
import Dispatch
#endif
@available(Android 33, *)
func backtrace() {
withUnsafeTemporaryAllocation(of: UnsafeMutableRawPointer.self, capacity: 1) { address in
_ = backtrace(address.baseAddress!, 1)
}
}
@main
struct ExecutableDemo {
static func main() {
#if os(Android)
print("Hello from Android API 28 or later")
if #available(Android 33, *) {
// The following code is only run on Android 33+ devices.
backtrace()
print("Hello from Android API 33+")
}
#endif
}
}
この例では、backtrace() 関数は @available(Android 33, *) によって Android 33 以降でのみ利用可能と宣言され、if #available(Android 33, *) のランタイムチェックの内側でだけ呼び出されます。これにより、より新しい API レベルの機能を、それより古い端末との互換性を保ったまま条件付きで利用できます。
Swift 6.3 SDK の nightly プレビュー
公式の Swift 6.3 SDK 向け CI が構築され、Swift 6.3 SDK for Android の nightly プレビューが配布されるようになりました。インストールと利用の手順は Getting Started ガイドにまとまっています。
Swift on Android はこの 10 年間コミュニティの取り組みとして育てられ、最初のパッチから実運用アプリと活発な開発者グループへと成長してきました。新しい Swift 6.3 SDK for Android のプレビューを試し、改善に協力することが呼びかけられています。
関連リンク
- Swift SDK for Android の発表 — プレビュー版 Swift SDK for Android の最初の発表
- GSoC 2025 ショーケース: Swift/Java 相互運用の拡張 —
jextractの JNI モードなど、Java 相互運用の成果 - swift-java — Java / Swift 相互運用プロジェクト(
jextract/wrap-java) - swift-android-examples — Swift on Android のサンプルアプリ集
- Android プロジェクトボード — workgroup が進める作業項目の一覧