世界を動かす技術を、日本語で。

Android用Swift SDK

概要

Swiftの進化により、Android向けSDKのナイトリープレビュー版が公開。 クロスプラットフォーム開発の新たな可能性が拡大。 Windows、Linux、macOSで利用可能。 SwiftとJavaの相互運用性も強化。 コミュニティ主導で今後のビジョン策定中。

Swift SDK for Android ナイトリープレビュー公開

  • Swift の成長と多様な分野への展開

    • クラウドサービス、Windowsアプリ、ブラウザアプリ、マイクロコントローラー対応
    • 高い相互運用性による クロスプラットフォーム開発 の実現
  • Android Workgroup の活動

    • オープンなグループで誰でも参加可能
    • SwiftのAndroid対応拡大を目指す取り組み
  • Swift SDK for Android のナイトリープレビューリリース

    • 数ヶ月にわたるAndroid Workgroupとコミュニティの努力の結晶
    • SwiftでAndroidアプリ開発が可能に
    • モバイルエコシステム全体の イノベーション加速
  • SDKの入手方法

    • Windowsインストーラーにバンドル
    • LinuxやmacOS向けに個別ダウンロードも可能
  • 開発サポートと事例紹介

    • Getting Startedガイド の提供
    • Swift for Android Examplesによるワークフロー解説
  • Swift Package Index の対応状況

    • 25%以上のパッケージが既にAndroidビルド対応
    • Community ShowcaseでAndroid互換性を明示

SwiftとJavaの相互運用

  • swift-javaプロジェクト の役割

    • JavaとSwift間での相互運用を実現
    • ライブラリ兼コードジェネレーターとして機能
    • 安全かつ高性能なバインディングを自動生成
  • ビジネスロジックのAndroid移植方法

    • Mads OdgaardによるSwift Server Side Meetupトークで解説

コミュニティと今後の展望

  • 開発体験やアイデアの共有推奨

    • Swiftフォーラムでの議論やAndroidカテゴリでの新規投稿推進
  • 今後のビジョン策定

    • Android Workgroupがビジョン文書を策定中
    • エコシステム全体への最大限のインパクトを目指す指針
  • プロジェクト管理と公式CI

    • 主要な取り組みの進捗を管理する プロジェクトボード
    • Swift SDK for Androidの 公式CI 運用
  • 参加呼びかけ

    • エコシステム向上に向けた 参加者募集

著者情報

  • Joannis
    • Android Workgroup議長
    • Server Workgroupメンバー
    • Hummingbirdメンテナー

Hackerたちの意見

このプロジェクトはSKIPトランスパイラに関連してるの? https://skip.tools/blog/bringing-swift-to-android/ 既存のSwift / SwiftUIアプリをAndroidに移植したいんだけど、React Nativeには移行したくないんだよね。

そう、Skipはこの取り組みに大きく貢献してるんだ!

もうトランスパイラーを使う必要はないよ。最近、SkipがAndroidでネイティブのSwift実行を追加したからね。トランスパイラーよりもずっと互換性が高いよ(両方とも維持してるけど)。

そうだね、Skipはもう1年以上、私たちのSwift SDKのプレビュー版をFuseモードで使っていて、すごく人気があるんだ!完全にネイティブなSwiftUIアプリをAndroidで作るために使ったブログ記事もあるよ。詳しくはここを見てね:https://skip.tools/blog/fully-native-android-swift-apps/ それから、トランスパイレーションとコンパイルについての他のコメントを明確にするために、Skipには2つのモードがあるんだ。Skip LiteはSwiftコードをKotlinにトランスパイルするモードで、Skip FuseはSwift SDKを使ってSwiftをAndroid用にネイティブにコンパイルするモードだよ。Skip FuseとSkip Liteは並行して動作していて、Skip LiteはAndroidの多くの人気Kotlinフレームワーク(Lottie、Firebase、Stripeなど)とのブリッジ統合を提供するために使われる。2つのモードの比較はここで読めるよ:https://skip.tools/docs/status/ そして、利用可能なモジュールの一部はここで見られる:https://skip.tools/docs/modules/ Swift SDK for Androidが正式にリリースされたことにすごくワクワクしてるし、私たちのプレビュー版から公式にサポートされているものに切り替えられるようになるんだ。

iOSアプリをAndroidに手動で移植しなくて済むなら最高なんだけど。もしビジネスロジックがSwiftで処理されるとしたら、具体的にこの統合はどうなるの?UIやSwiftUIは最初はサポートされないってことかな?私のアプリ[0]はメタルシェーダーコードをたくさん使ってるんだけど、それを簡単に移植する方法はないよね?[0] https://apps.apple.com/app/apple-store/id1545223887

うん、SwiftUIも見てみたいけど、あれはAppleのエコシステム専用だよね。

メタルはAndroidでは使えないよ。ビジネスロジックはライブラリとして分ければ移植できるけど、分けたくないなら、SkipがSwiftUIを含む多くのAppleライブラリのブリッジを処理できるよ。

シェーダーの移植は、最新のLLMを使えば30分でできるよ。本気で言ってる。私もやったことあるし。シェーダーは結構シンプルだよ。ちょっと変なアーティファクトが出るかもしれないけど、それは翻訳エラーよりもプラットフォームの違いによるものだと思う。

「iOSにKotlinが入った!」 「AndroidにSwiftが入った!」

iOSのKotlinは静的にコンパイルされて、Swift/ObjCとネイティブに相互運用できるんだ。KMPがiOSでFlutterみたいにDartのVMを動かしてるとは思えないけど? https://kotlinlang.org/docs/native-overview.html

完璧に届けられた、リースのCMはいつまでも続くね。比喩を完全に合わせるには、クシャクシャのラッパーでKotlinとSwiftのハイブリッドが必要だけど。

彼らが本当にこれを続けてくれることを願ってる。例えば、Swiftの埋め込みは実用的なプラットフォームというよりは概念実証みたいなもので、解決したい問題よりもそっちと戦うことになるからね。見た目はSwiftが現代の安全な言語の中で一番美しいのに、プロジェクトのリーダーシップについてコミュニティで変な噂があって、雰囲気が悪くなってるのが残念だよ。

ありがとう。もうRNとFlutterはやめてほしい。タッチ処理する四角いUIアプリには、2日でうんざりだよ。

Flutterではコーナー半径を好きなように設定できるし、フレームワークもかなり速いよ。アプリがタッチに反応しないなら、それはおそらく作りが悪いアプリだね。

RNやFlutterにはあまり愛着がないけど、なんでAndroidでSwiftがFlutterやRNに近いと思うの?むしろ、Appleがこれを発表してもすぐに忘れそう。

これが公式プロジェクトとして見られるのはすごくワクワクする!サイドプロジェクトでRNやFlutterみたいなマルチプラットフォームフレームワークをいじってたけど、なんかしっくりこなかったんだ。プラットフォームごとにネイティブUIを使って、ビジネスロジックを共有するいい方法があればいいな。KMPはあるけど、アプリを作りたい大多数の開発者は、まずiOS用に作って、アプリが注目されたらAndroidに移植するのが一般的だと思う。共有コードをSwiftパッケージに保つことを考えれば、ますます可能になってきてるみたいで、いいことだね。

これはすでに.NETとMvvmCrossで可能だよ:共有コアライブラリと各プラットフォームのネイティブUIプロジェクト。C#でのUIKitはすごく良い感じで、Xamarinの時代からずっとうまく動いてるし、Nugetエコシステムにもアクセスできるよ。

ビジネスロジックをJavaScriptで書くのも、クロスプラットフォームの人たちには無視できないと思う。もちろん、パフォーマンスが重要な部分や非同期APIが使いづらいところでは注意が必要だけど(JavaScriptCoreやQuickJSを使うってことね、WebViewで動かすだけじゃないよ)。iOS(v7.0以上)やAndroid(最近になってだと思う)でも動くし、もちろんウェブやサーバーサイドでも使える。しかも、ホットリロードができるから、プラットフォームの制約に引っかからなければ(バグ修正や小さな挙動の変更には使えるけど、新機能を追加するのはダメ)。モバイル開発でイライラするのは、一度バージョンをリリースすると、そのバージョンが誰かのデバイスで無限に動き続けること。私の仕事はさらに一歩進んでいて、顧客にSDKのバージョンを更新してもらわないといけない(多くの顧客は社内にモバイル開発チームがないから、外注することになる)。アプリのアップデートを出す前に、エンドユーザーがその新しいデプロイメントターゲットをサポートしているかもわからない…(このアイデアを9年くらい上司に売り込んでるけど、まだ通ってないから、見落としてる部分もあるかもしれないけど、すごく大きなチャンスを逃してる気がする)。

でも、ほとんどの開発者がアプリを作りたいと思ったら、まずiOS向けに作って、アプリが注目を集めたら後でAndroidに移植するのが一般的だと思う。そうなの?Java開発者が1億人もいるみたいで、Androidアプリを作れるし、個人開発やサイドプロジェクトなら最小限の登録料でリリースできる。Objective-CやSwiftの開発者はその10%くらいしかいないみたい。私は暇なときにAndroidアプリをいじってたけど、iOSに何かをデプロイすることはできなかった。あと、アメリカ以外ではiPhoneはプライベートでは10%のニッチ商品だけど、企業はiPadをたくさん使ったり、仕事用のiPhoneを提供したりするから、企業は両方のプラットフォームを二流扱いしてるかもね(Windowsやブラウザが他の「OSっぽい」主要プラットフォームとして)。

React Nativeは、FlutterやCompose Multiplatformとは違って、プラットフォームごとにネイティブUIを使ってる。React Nativeはかなり改善されてるよ。5年前とは全然違う技術だし、特に今年はスピードに関する改善もたくさんあったし、React Nativeやコミュニティプラグインも進化してる(新しいアーキテクチャが導入されたり、Reactコンパイラ、Hermes v1、Nitroモジュール、Flash List v2、Legend List、React Native Skia、React Native WebGPU、ExpoがDOMを使うようになったり)。JS/TSエコシステムのツールもかなり改善された。

KMPは存在するけど、ほとんどの開発者がアプリを作りたいと思ったら、まずiOS向けに作るのが一般的だと思う。これ、アメリカ中心に聞こえるな。KMPの利点は、かなり成熟していて、Google Workspace(Google Docsなど)みたいな大きなアプリで使われてるから、かなり良いポジションにいるように感じる。Flutterが始まった頃はワクワクしてたけど、大きなリリースのスピード(Flutter 2のためにアプリを書き直してたら、Flutter 3が出てたとか)や、あまり注目を集めてない気がした(Dartは楽しいけど、まあ)。KMPはKotlinの上に構築されていて、JetBrainsとGoogleからの大きな投資がある。これは非常に期待できると思う。

Protonでは、共有ロジックにRustを使ってる(彼らの主張によると、コードベースの80%以上だと思う)、残りはプラットフォーム固有のもの。

これは本当に面白いね。以前、クロスプラットフォームのモバイルライブラリを作ったことがあって、結局Rustを使ったんだけど…それはそれで良かった。でも、問題の半分にすでに流暢な言語を使うことには大きな利点があるよね。Swift/Webassemblyとの組み合わせがどれくらい良いのか、気になるな。

今はLLMがあるから、流暢に話す必要はあんまりないよね。

クロスプラットフォームフレームワークにとって一番重要な質問は、UIがどうなるかってこと。Adobe製品(Creative SuiteやFlashアプリ用のFlex Builder環境)は、どのプラットフォームでも異質なデザインシステムを持ってた。ネイティブに感じるものが欲しいなら、Apple AquaをFlashで自分で再実装する必要があった。Flutterはその作業を代わりにやってくれて、iOSでピクセルパーフェクトな「Cupertino」テーマを目指してる。React Nativeは複雑なウィジェットのためにプラットフォームのプリミティブに委譲しようとしてるから、スクロールビューはAppleのプラットフォームではAppleの感じがする。ここにあるほとんどのトップレベルのコメントは、そのことについて何らかの形で話してるけど、ブログ記事では全然触れられてない。AppleやSwiftの開発者の間での認知度が高いから、Swift版のアプリがAndroid向けに出る可能性が高いと思う。AppleのUIを使うことになるかもしれないけど、Android用に特別なものを作るのが面倒だから。とはいえ、Appleは自社のデザイン言語に誇りを持ってるから、自分たちが所有していないプラットフォームで良い感じのものを実装することには消極的かもしれない。もしAPI互換のウィジェットツールキットを出すとしたら、意図的に悪いスプリング物理を使って、iPhoneじゃないことを思い出させるかも。コミュニティの部分がどれくらい大きいのか気になるな。これはApple以外の人たちがAppleのプラットフォームを壁の中から引き出そうとしてるオープンソースプロジェクトなの?それとも、Appleが多く資金を提供してるの?最終的には、これがどう展開するかに大きな影響を与えるだろうね。

これって、UIの作り方に対する期待を追加するわけじゃないってことは覚えておく価値があるね。スクリーンショットに示されている例は、KotlinがSwiftのビジネスロジックを呼び出す形で、Jetpack Compose(AndroidのネイティブUI)を使い続けてる。もちろん、Androidでは他のUIフレームワークも使えるし、Swiftで書かれたものもあるよ。この実装のいいところは、他のプラットフォームのSwiftと同じ特性をたくさん共有してることだね。一般的な代替手段とは違って、ガーベジコレクションじゃなくて参照カウントを使ってるし、同じ基盤のライブラリや並行処理のプリミティブ、メモリモデルを使ってる。みんながどう使うのか楽しみだな…これが他の面白いイノベーションのきっかけになればいいね。 [開示: 私はAppleで開発者ツールとフレームワークに関わっています。]

Apple/Swiftが開発者の間での認知度を持つことで、AppleのUIを使うことになっても、SwiftバージョンのアプリがAndroid向けにたくさん出る可能性があるかもしれないね。このリリースにはSwiftUIやUIKitをAndroidに持ってくることは含まれていないみたいだから、AppleのUIを使ってAndroidで再現するにはかなりの作業が必要だろうね。

すべてのクロスプラットフォームフレームワークにとって最も重要な質問は、UIはどうなるのか?私はちょっと意見が違うな。クロスプラットフォームフレームワークに求める最初の機能は、ネイティブUIを書けることなんだ。だからKMPが好きなんだ。SwiftUIで作ったiOSアプリとフレームワークを共有できるからね。ビジネスロジックを共有するのは多くのケースで理にかなってるし、昔からやってきたことだよ(C/C++/Rust/Goのライブラリとか)。複雑なアプリでUIを共有するのは、私の経験上、いつも「一度書いて、どこでもデバッグ」っていう悪夢になる。KMP(そしてSwift for Android)がもたらすのは、C/C++/Rust/Goとコードを共有する代わりに、Kotlin(またはSwift)のライブラリを共有できる可能性なんだ。だからAndroid/iOSのチームは、ロジックを共有するために別の言語を導入せずにAndroid/Swiftを使い続けられる。

Browser CompanyはSwiftUIをWindowsに移植するのを素晴らしい仕事をしたね。言語の要素プリミティブが、内部でネイティブなWindows UIのC++クラスにマッピングされている。もしかしたら、Swift for Androidの未来も似たような感じで、SwiftUIがJetpackの要素にマッピングされるかもしれない。それはクールだね。iOSやMacOSでは、SwiftUIは「ネイティブ」じゃないことを覚えておいてね。システムフレームワークが解釈して、NSViewsやUIViews、CGLayersなどを作り出すための記述言語なんだ。

私は長い間、AndroidとiOSの間でコードを共有してきたけど、UIを共有するのは非トリビアルなアプリにとっては常に悪夢だった。共有するのが理にかなっているのは複雑なライブラリで、私は通常C/C++/Rustのライブラリでそれをやってきた。でもそれだと、チームはKotlin、Swift、そしてその「共有」言語の一つ(または複数)を扱うことになる。KMPとSwift for Androidがもたらすのは、チームがKotlin/Swiftでライブラリを共有できるようになることだと思う。そうすれば、C/C++/Rustを導入せずに、自分たちの好きな言語で書き続けられる。私はこのアプローチが、UIを共有しようとするどんなフレームワークよりもはるかに優れていると思う。モバイル開発者は、私の経験上、ネイティブツールを使いたがるんだ。AndroidにはKotlin、iOSにはSwiftが必要だよ。

この発表は、SDKの新しいサポートが成功したことを証明していると私は思ってる。以前は、別のプラットフォームをサポートするためには、最悪でもCMakeの複雑な絡み合いが必要だった。Swift SDKは誰でもどんなプラットフォームをサポートできる方法で、Androidの人たちが自分たちでそれをやっていることが証明している。Linux、wasm、組み込み用のSDKもあって(そしてすぐにWindowsも?)、SDKのルールに従っていれば、Appleは競争相手のプラットフォームであってもSwiftを新しいプラットフォームに移植するのを止めないよ。(JVM言語との相互運用の話はまだ書かれている最中で、C/C++のFFIか、Javaの古いJNIと新しいFFI/メモリインターフェースの2つの不完全なデュアルに収束する。セマンティクスが同じならプロトタイプはうまくいくけど、それを超えるとドラゴンが待ってる。クロスプラットフォームのUIフレームワークも同様に(そしておそらく永遠に)明るい部分と暗い部分の影響を受けている。)