この講演ではSwiftがAndroidでどのように動作するかという概念とどのようにすればSwiftをAndroidで動かせるかということをご説明します。前半はどのようにコア言語としてのSwiftをAndroidで動作させるのかということをAndroid NDKへの入門も含めてお話します。後半はAndroidでSwiftを使う際のライブラリや(リリース可能な)アプリの書き方をお話します。ネイティブのAndroid APIのことだけでなくSwiftでクロスプラットフォーム開発(iOS, Mac, Linux, Windows?)をするための興味深いアイデアについても議論したいと思います。
Swift on Android
こんにちは。
なぜSwift on Androidなのか
クロスプラットフォームの有用性はご存知だと思います。
読まないで下さい
正直に話します
自分の話は信じられるのかと思われるかもしれないが
私はアンドロイドエンジニアで、またCocoaの熟達したエンジニアです。
衛星の打ち上げ?に関わったりしていました。
サイエンティフィックビジュアリゼーションがわたしの専門です。
ということで言語の橋渡しについては熟達しています
Android開発の必要がありSwiftでAndroidアプリを、おそらく初めてくくりました。
やるべきことだけではない、コンセプトのお話をします。
たとえばandroidの場合はUnixとLinuxを考えるなどの比喩を通して基本的なことを理解して下さい。
Cは移植性が高くABIが安定しています。あらゆる全ての言語がCと通信が可能です。ということでCには何度も触れます。
Swift on Andoridでもそれ以外の言語でも、言語とライブラリの区別をすることが大事です
UIKitはAndroidに移植されることはないでしょう。
SwiftのCoreのみが重要なんです。Intやランタイム以外はオプションです。
アプリとしてリリースできるものには余分なものは入っていません。エンドユーザーがソースコードからコンパイルすることを期待してはいけません。
最後の二つは間違っています。
正しいやり方でお話をしたいと思います。
AndroidAppはJavaのSDKを使う必要がありましたがGameデベロッパーの要望に答えC/C++などのライブラリが登場しました。
NDKは残念ながらお粗末です
かれらはセガサターンにさえ文句を言わないのに文句を言っている。NDKはAndroidにおいては2級市民でお粗末、Googleには担当者が2人しか居ません。
公にこうして批判するツールが残されたツールです。
Luaは組み込み可能な言語です。移植性に優れています。1つのコードベースでAnsiCに完全互換です。
1990年向けコードベースを修正すること無く実行できます。モダンNDKでやってみましょう、ビルドに失敗します。
AndroidのCライブラリは様々なコードからでてきたものが混ざっています。
ダイナミックライブラリの挙動にも非常に不安定な部分があります。
これが特別に対応されたクロスプラットフォーム対応プログラムを必要とする理由です。
C++でライブラリを作らないという教訓が人が減って伝えられていないようです
NDKで問題が顕在化します。
バンドリングされないのでみなさんでバンドリングが必要です
人々は彼らのNDKをアップグレードしたりしていないので様々なNDKバージョンが混在し、全ての異なるC++標準ライブラリを含まなくてはいけないことになる。
パッチを送ったが結局採用されなかった
libICUはC++ライブラリで書かれていてアンドロイドが内蔵している可能性がある。自分のライブラリと一緒にローソしようとした時何もしない形になってしまう。OSはロード済みと扱うため。しかしバージョンはマッチしない。ICUを使う時にクラッシュが起きる。
AndroidでSwiftを使うということにやっとなるが、AndroidAppは全てAndroidSDKを使わなければいけません。JavaでスタートしてCを経てSwiftに入る必要があります。
必ず最初にActivityが必要です。onCreateをスタートポイントにします。
順番が重要です。依存性を全てロードして、それからSwiftで書かれたものをロードします。
ここでCに入ります、ここからSwiftに入る必要があります。
もう一つコツが有ります。イベントループをブロックしてはいけません。
Swiftをアプリの中でどう使うか考えておく必要があります。
バックグラウンドスレッドを作ることもできますが、何のためにするか分かっていなければ、トラブルが増えるので推奨しません。
あとで読んで下さい。
ただし注意、staticとGlobal変数の初期化には注意して下さい。
Global変数が初期化されたりされなかったりすることがある。ダイナミックライブラリがメモリを残していれば消えていないので、前回のあたいが残っている。
今のところはこのようなパターンが必要な場合は手動で初期化してください。
このTweetには共感します。
ビルドシステムがぜんぜん違う。
どうするか。
Swift Package Managerは使えないと思う。自分でやるのは難しい。
CMake
AndroidStudioの一部として採用されると発表された
Swift対応中
こんなスクリプトです。
SwiftでAndroidは出来るか?出来るが困難。
JNIを通らなくてはいけない、すべてを使えるわけではない。ただ様々なソリューションはある。JNIをカプセル化していく。
基本的にあらゆるプラットフォームにCライブラリが有り、あればSwiftから使える。これらを使えばSwiftでクロスプラットフォームが出来る。
これはFlappy Birdのクローンです。
クロスプラットフォームで利用できます。
GUIはどうでしょう。Nuclear
Open GLがよく使われるがそれ以外にも対応できる
デザインに関しては様々なスクリーンサイズを念頭に置く必要があります。
Cocoaをクロスプラットフォームで使えればと思うでしょう、様々なプロジェクトが有りましたが殆どが夢半ばです。
その中でもIUPがおすすめです。
Cで書かれていて言語バインディングが念頭に置かれている。LEDでコードと言語を区別している。
プラットフォームの違い、オブジェクト指向言語を使っていないということも想定している。
Cの弱い型システムに向けてプロトコル指向です。
でも私たちはCocoaの専門家なので作ることができます。
Mobileは?
ボタンを押すとウィンドウが新しく出来るプログラム
NavigationControllerとViewControllerを利用
ダイアログをアクティビティにマッピング
Windowsでも!
ビルドのシステムチャレンジをBlurrrが解決
非常に真剣に取り組んでいます。
軌道に載せたいので支援が必要です。ハッカソンではゲームワークショップを行います。
わたしの師です。
昨年亡くなってしまいました。
亡くなってしまったのでTwitterが更新されなくなってしまいました
一緒にプロジェクトを進めたいと思っていました。でもタスクがいろいろあって優先順位を高く進めることができませんでした。
クロスプラットフォームSwiftを可能にしたのは彼の力によるところが多いわけです。
Q&A
最初の点について、Appleがどのくらい悪いのか
私が仕事した会社ではAndroidのほうが4〜10倍難しいですね
たとえばSwift Androidのプラットフォーム間の違い、マネジメント例えばメモリ管理
SwiftはNDKを使います。ここでAndroidのメモリマネジメントは、Javaは完全に管理されていて、人工的なメモリリミットをAndroidアプリに課している。NDKを使えばあらゆるメモリを使うことが出来る。RAMはiOSよりも通常多いです。