📱

Swift SDK for Android と Skip について

に公開

Swift SDK for Android

Swift SDK for Android

2025年10月24日、Apple は Swift を使用し Android のアプリ開発を行うことができる「Swift SDK for Android」が公開しました。
Swift SDK For Android は Swift を iOS アプリ用にコンパイルや、Kotlin から Android のアプリをコンパイルと同様に LLVM を使用して実現しています。
注意点として Android のアプリ開発できるという触れ込みですが、オープンソースになっている Swift の Foundation 部分と一部のみであるため、
Kotlin Multiplatform(KMP) のように UI やデバイスの機能に関しては自前で作成する必要があります。
KMP で使用される Compose Multiplatform の様に UI も開発をしたい場合は有償のサービスですが Skip.tools を使用する必要があります。

Swift SDK for Android に価値はあるのか?

先にも記載していますが、Swift SDK for Android は Foundation などの対応であるため、現状この機能だけでは正直使い道がないかなと考えています。
TIOBE や GitHub のプログラミング言語のランキングで Swift は Kotlin よりランクが低く使用率が低く、
Swift 自体そもそも使用者が少なく、AI 等でコーディングやサポートを受ける場合に使用者が多い方が有利なためです。

ただ、Skip など Swift から Android アプリ開発のサポートの礎となるため今後の発展に期待できますし、
堅牢なメモリー管理や非同期処理、
プログラミング言語として Swift が好きな方には面白い選択肢になると思われます。

Swift から Swift SDK for Android が生まれるまで

2015年12月3日に Apple は Swift を Apache 2.0 ライセンスの下でオープンソース化しました。
それとともにパッケージ管理ツール Swift Package Manager(SPM)が公開され、アプリ開発や Swift のライブラリとして様々なフレームワークが作成されていくことになります。

2016年に Linux 上で Swift がサポートされ Swift のコードが実行できるようになり、このことによってサーバー側向けの Swift やライブラリが発表されました。
過去には IBM が Kitura というフレームワーク発表したり、IBM Bluemix(現 IBM Cloud)に対応したり、Amazon が Prime Video の一部で Swift を使用しており、
この頃は大手で使用されていました。

時はしばらく経ち、2020年には Swift のコードを Windows でビルドできる環境が発表されます。
Swift SDK for Android 同様に UI 部分は Windows プラットフォーム用で別開発が必要であるため最初は話題になりました。
私が知る限りでは Arc というブラウザの Windows 版が Swift で書かれているという事例しか知りません。
ちなみにここで SPM の対応プラットフォームの設定に Windows とともに Android が追加され、この頃から Swift の Android 対応に期待していました。

2023年4月に Foundation がオープンソースになります。
過去の iOS アプリでは基礎部分を Core Foundation という C 言語のインターフェースを持つフレームワークを使用しており Objective-C でラッピングされておりました。
Swift でも同じように Core Foundation をラップするのを基本として、Darwin や Objective-C ランタイムへの依存を無くし
Swift で書き直したものが Foundation となります。

2023年9月に Swift 5.9 発表時に C++(Objective-C++)の相互運用性を発表。
これまでは C や Objective-C からブリッジする必要がありましたが、Swift から C++、C++ から Swift など直接呼べる様になりました。
このことにより各プラットフォームの機能にアクセスしやすくなります。

2024年3月に Panic のハンドヘルドゲームシステムである Playdate でゲームを作成したり、
4月には ARM、RISC-V、ESP32 など組み込み向けの Embedded Swift を Swift.org で発表。
その後に WWDC で発表されました。

2024年末に Swift の GitHub に swift-java のリポジトリが公開され、2025年5月 WWDC 前に Swift.org で swift-java が発表。
C++の相互運用性と同様に Swift から Java に変換できる様になりました。

2025年9月 Swift 6.2 で、Swift に WebAssembly の生成を正式サポートされ、
デスクトップやサーバーで WebAssembly のコードの実行可能できる様になりました。

そして、2025年10月に Swift SDK for Android が発表されることとなります。

年代 Swift の進化
2015年 Swift 3.0 でオープンソース化
2016年 Linux で Swift のコードが実行可能に
2020年 Windows で Swift のコードが実行可能に
2023年 Foundation がオープンソース化
C++の相互運用性がサポート
2024年 Embedded Swift 発表。組み込み向けで Swift のコードが実行可能に
2025年 swift-java が発表され Swift で Java の相互運用性がサポート
Swift のコードから WebAssembly の生成が可能に
Swift SDK for Android が発表。Android で Swift のコードが実行可能に

Swift は Android でどのように動作しているのか

Swift から LLVM 経由して、共有オブジェクトである .so ファイルを作成、
ELF 形式でコンパイルし、Android で実行可能なバイナリファイルを作成しているのだと思われます。

また、UI など Swift SDK for Android にない機能は swift-java を使用し、Swift とやり取りする必要があります。

Swift SDK for Android を試す

以下、Getting Started with the Swift SDK for Android の抜粋となります。

前提

前提として Swiftly ツールチェーン、Android 環境でアプリを実行する adb が必要になります。

Swiftly

Swift.org にも記載されていますが、
ターミナルから以下のコードで Swiftly ツールチェーンを取得します。

curl -O https://download.swift.org/swiftly/darwin/swiftly.pkg && \
installer -pkg swiftly.pkg -target CurrentUserHomeDirectory && \
~/.swiftly/bin/swiftly init --quiet-shell-followup && \
. "${SWIFTLY_HOME_DIR:-$HOME/.swiftly}/env.sh" && \
hash -r

adb

adb が実行できる Android SDK Platform-Tools をタウンロードしてください。

Android Studio をインストールでターミナルから adb を呼べたか忘れましたが、
ターミナルで動作する様であれば Android SDK Platform-Tools のインストールは不要です。

Android 用の Swift コードをクロスコンパイルするための 3 つのコンポーネント

Android で動作させるために以下のコンポーネントが必要になります。

名前 機能
ホストツールチェーン Swift のビルドと実行に使用するコマンドと関連ツール
Swift SDK for Android Android ターゲット用の Swift コードを生成して実行するために必要なライブラリ
Android NDK C / C++ を使用した Android の開発環境

ホストツールチェーンをインストールする

すでに Xcode がインストールされている場合でも、クロスコンパイルで Swift SDK を使用する場合は、ホストツールチェーンと Swift SDK のバージョンが正確に一致させる必要があります。
そのため、指定された Swift SDK バージョンのホストツールチェーンの特定のバージョンをインストールします。

ターミナルから以下のコード入力。
3行目の確認で「Apple Swift version 6.3-dev〜」が出力され Swift 6.3 がインストールされたことがわかります。

swiftly install main-snapshot-2025-10-16
swiftly use main-snapshot-2025-10-16
swiftly run swift --version

Swift SDK for Android をインストールする

次に Swift の sdk コマンドを使用して、Swift SDK バンドルをダウンロードしてインストールします。

swift sdk install https://download.swift.org/development/android-sdk/swift-DEVELOPMENT-SNAPSHOT-2025-10-16-a/swift-DEVELOPMENT-SNAPSHOT-2025-10-16-a_android-0.1.artifactbundle.tar.gz --checksum 451844c232cf1fa02c52431084ed3dc27a42d103635c6fa71bae8d66adba2500

Android NDK をインストールする

最後に Swift SDK for Android は、Android NDK バージョン 27d 〜に依存しているため、対応バージョンの Android NDK をダウンロードします。

mkdir ~/android-ndk
cd ~/android-ndk
curl -fSLO https://dl.google.com/android/repository/android-ndk-r27d-$(uname -s).zip
unzip -q android-ndk-r27d-*.zip
export ANDROID_NDK_HOME=$PWD/android-ndk-r27d

NDK をダウンロードし展開(解凍)後、Swift SDK バンドルに含まれている setup-android-sdk.sh ユーティリティスクリプトを実行して、NDK を Android 用の Swift SDK にリンクする必要があります。

cd ~/Library/org.swift.swiftpm || cd ~/.swiftpm
./swift-sdks/swift-DEVELOPMENT-SNAPSHOT-2025-10-16-a-android-0.1.artifactbundle/swift-android/scripts/setup-android-sdk.sh

Android で Hello World

まず、通常の Swift で Hello World を出力します。

今回作成する SPM 用の hello のフォルダを作成。

cd /tmp
mkdir hello
cd hello

新しいパッケージを作成。

swiftly run swift package init --type executable

ビルド後、実行で「Hello, world!」が出力されます。

swiftly run swift build
.build/debug/hello

通常の出力は確認できたため、Android から出力します。
ARM 用の aarch64 で実行ファイルをビルド。

swiftly run swift build --swift-sdk aarch64-unknown-linux-android28 --static-swift-stdlib
file .build/aarch64-unknown-linux-android28/debug/hello

実行ファイルと libc++_shared.so と共にファイルをコピーし、adb ユーティリティで実行します。
adb から USB で接続した実機、またはエミュレーターから「Hello, world!」が出力されます。

adb push .build/aarch64-unknown-linux-android28/debug/hello /data/local/tmp
adb push $ANDROID_NDK_HOME/toolchains/llvm/prebuilt/*/sysroot/usr/lib/aarch64-linux-android/libc++_shared.so /data/local/tmp/
adb shell /data/local/tmp/hello

Swift SDK for Android で Jetpack Compose の UI と連携する

記事の量が倍以上になるため今回は割愛。
いつか書くかもしれません。

サードパーティ製ツール Skip について

Skip
現状、Swift SDK for Android は SwiftUI を使用することができないため、
Jetpack Compose を使用し UI を作成したり、
Swift SDK for Android の機能を超える場合は各 OS で実装する必要があります。
また、KMP で実感しているのですが、各 OS 別々実装する場合、Foundation などでできることが少ないためか開発効率が劇的には上がりません。

Skip は有償のサービスではありますが Swift で iOS と Android のアプリが開発できます。
UI と機能が iOS と Android 共通で共にネイティブコードでコンパイルされるため、見た目、実行速度、開発効率の向上が期待できます。

OS 対応バージョン

iOS 16 〜
Android API 29(Q : Android 10.0)

Skip のコンパイルのモード

Skip のコンパイルには Swift を Kotlin / Java にトランスパイルする Lite、
Swift を直接実行バイナリに変換する Fuse の 2 種類があります。

現状、Fuse はアプリ容量が増える点とビルド時間かかる点がありますが、時が経つにつれて解消されると思われます。

Skip の UI はどのように作成するのか

Skip は SwiftUI で作成し、Android は見た目を合わせてネイティブのものが作成されます。
SwiftUI の Table や Charts などはありませんが一通りの UI が使用可能です。
元々は Kotlin / Java にトランスパイルされていたため、1コードで各タイプのマルチプラットフォーム開発環境の中では見た目がよい方だと思われます。

Skip で iOS から Kotlin / Java 呼び出しは可能か?

Swift のコードから #if #else #endif で条件分けが可能です。

func printFormatted(time timeInMills: Int64) { 
    #if os(Android)
    let formatted = androidTimeString(milliseconds: timeInMills)
    #else
    let formatted = … iOS code path …
    #endif
    print(formatted)
}

#if SKIP
func androidTimeString(milliseconds: Int64) -> String {
    let dateFormat = java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", java.util.Locale.getDefault())
    dateFormat.timeZone = java.util.TimeZone.getTimeZone("GMT")
    return dateFormat.format(java.util.Date(milliseconds))
}
#endif

Skip で使用できる機能とは?

以下の機能が iOS / Android 共通で使用できます。

名称 機能
SkipAV 動画再生オーディオ再生・録音
SkipBluetooth Bluetooth の一部機能
SkipDevice ネットワークの状態、位置、およびデバイスセンサーデータへのアクセス
SkipFFI C / C++ ライブラリに呼び出す機能
SkipFirebase Firebase SDK を扱う機能
SkipKeychain Keychain や EncyptedSharedPreferences にデータを保存する機能
SkipKit カメラロールなどデバイスの権限を要求する機能
SkipMarketplace 各 App のストアレーティング用。将来的にはアプリ内購入とサブスクリプション管理を入れたいとか
SkipMotion Lottie アニメーションを再生する機能
SkipNFC 簡単な NFC 機能のサポート
SkipPostHog オープンソースの製品分析 PostHog のサポート
SkipScript JavaScript の実行
SkipStripe モバイル決済 Stripe SDK のサポート
SkipSQL SQLite データベースへのアクセス
SkipWeb 埋め込み WebView
SkipZip ZIP アーカイブのサポート

Skip のライセンス価格

Indie
価格: 無料

  • 無制限のオープンソースアプリ
  • 1つのクローズドソースアプリ
  • コミュニティサポートフォーラム
  • コミュニティSlackチャンネル
  • 1〜2人のメンバーを持つ個人または組織で、関連する年間収益が3万ドル未満である必要があります

Small Business
価格: 29ドル/月 または299ドル/年(16%割引)

  • 無制限のオープンソースアプリ
  • 5つのクローズドソースアプリ
  • 専用サポートメール
  • 専用のSlackチャンネル
  • 年間収益が25万米ドル未満の企業/個人、または非営利団体/教育機関である必要があります

Professional
価格: 99ドル/月 または999ドル/年(16%割引)

  • 無制限のオープンソースアプリ
  • 無制限のクローズドソースアプリ
  • 専用サポートメール
  • 専用のSlackチャンネル
  • 優先サポート
  • あらゆる規模と収益の組織向け

まとめ

Swift SDK for Android については、UI や各 OS 実装部分を考えると設定が多すぎて簡単に扱えるものではないのですが、Android へ対応したことにより Swift の実行環境が、ほぼ全てのプラットフォームに対応したことは嬉しいです。

ただ、残念ながら Swift の使用率が少ないため大きな発展が期待できるとは言えないのですが、Android 対応の基礎部分としてこれからも発展してほしいです。

とりあえず、Apple が SwiftUI を変換する機構を作らない限りは、
便利さから考えると iOS からの Android クロスプラットフォーム開発環境は Skip 一択というと状態は変わらないと思われます。

Discussion