Swift Digest
Blog | Swift.org Blog

Swift SDK for Android を探る

Exploring the Swift SDK for Android

このダイジェストはClaude Opus 4.7 / 4.8によって生成されたものです(License)。原文はこちら

この記事の要点

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 アプリは何年も前から実運用されており、累計で数百万回ダウンロードされています。記事では次のような例が挙げられています。

進行中の作業

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 のプレビューを試し、改善に協力することが呼びかけられています。

関連リンク