This talk will give you a conceptual understanding of how Swift works on Android and how you can use it. The first part of the talk focuses on how to make Swift (just the core language) work on Android, including an introduction to the Android NDK. The second part will focus on libraries and how to write (shippable) apps with Swift on Android. We will discuss both native Android APIs as well as the more tantalizing idea of how to do cross-platform development with Swift (e.g. iOS, Mac, Linux, Windows?).
この講演ではSwiftがAndroidでどのように動作するかという概念とどのようにすればSwiftをAndroidで動かせるかということをご説明します。前半はどのようにコア言語としてのSwiftをAndroidで動作させるのかということをAndroid NDKへの入門も含めてお話します。後半はAndroidでSwiftを使う際のライブラリや(リリース可能な)アプリの書き方をお話します。ネイティブのAndroid APIのことだけでなくSwiftでクロスプラットフォーム開発(iOS, Mac, Linux, Windows?)をするための興味深いアイデアについても議論したいと思います。
Swift on Android
こんにちは。
なぜSwift on Androidなのか
クロスプラットフォームの有用性はご存知だと思います。
読まないで下さい
正直に話します
自分の話は信じられるのかと思われるかもしれないが
私はアンドロイドエンジニアで、またCocoaの熟達したエンジニアです。
衛星の打ち上げに関わったりしていました。
サイエンティフィックビジュアリゼーション(scientific visualization)がわたしの専門です。
当時Windowsは不安定でMacでGUIを作っていました。
ということで言語の橋渡しについては熟達しています
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(Android Native Development Kit=C/C++用公式Android開発ツールセット)は残念ながらお粗末です
John Carmackはセガサターンにさえ文句を言わないのに文句を言っている。NDKはAndroidにおいては2級市民でお粗末、Googleには担当者が2人しか居ません。
公にこうして批判することが残されたツールです。
Luaは組み込み可能な言語です。移植性に優れています。1つのコードベースでANSI-Cに完全互換です。
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のクローンです。
Blurrr SDK Open Beta | Blurrr SDK
クロスプラットフォームで利用できます。
GUIはどうでしょう。Nuklear
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よりも通常多いです。
みんなの反応
この人の本、読んだ。 #tryswiftconf
— Hirohito Kato ⌘ (@hkato193) 2017年3月2日
開発環境にあまり愚痴を吐かない有名なゲームDeveloperの一言
— ダンボー田中 (@ktanaka117) 2017年3月2日
「Androidはひどい」
#tryswiftconf
なんでやセガサターン関係ないやろ! #tryswiftconf
— ぎぎにゃん (@giginet) 2017年3月2日
ジョン・D・カーマック - Wikipedia https://t.co/DLFiuQgyOt
— ダンボー田中 (@ktanaka117) 2017年3月2日
DoomとかQuake作った人か。伝説じゃん
#tryswiftconf
拙作unity-swiftと近しい感じが…。 https://t.co/AqWoifOrux #tryswiftconf
— Masayuki Iwai (@myb) 2017年3月2日
Android NDK、ひたすらディスられる #tryswiftconf
— satoshi namai (@ainame) 2017年3月2日
「夢半ばで屍を晒しています」すごい翻訳だ #tryswiftconf
— ٩(๑❛ᴗ❛๑)۶kiwi (@koga_wiwi) 2017年3月2日
めっちゃ面白かったからSpeaker Nightで絶対に話したい #tryswiftconf
— ぎぎにゃん (@giginet) 2017年3月2日
ここまで話したことをちゃんとプロダクトに仕上げてるのすごすぎる…… #tryswiftconf
— Syo Ikeda / いけしょー (@ikesyo) 2017年3月2日
なぜそこまで Swift にこだわるのか、最後に明かされた理由に涙 #tryswiftconf
— Naruki Chigira (@naruchigi) 2017年3月2日
「androidもswiftで書けたらいいよね」みたいなこと気軽に言っていてすみません🙇 となる発表でした!すばらしい知見だと思うので後で見直したい。 #tryswiftconf
— Yoshikuni Kato (@yoshikuni_kato) 2017年3月2日
先ほどのEricさんが教えてくれる。ワークショップが3/4にあります。すでに満席ですが席は少しだけ余裕があるので、増やせるか聞いてみます。 https://t.co/0xTSVEZWmo #tryswiftconf
— kishikawa katsumi (@k_katsumi) 2017年3月2日
もっと反応を見る
気に入った記事は はてなブックマーク
はてなブックマークアプリiOS開発チームから来ました! はてなブックマークにはSwift特集があります! 良い記事を見逃さないように、ご利用ください! http://b.hatena.ne.jp/hotentry/it/Swift
そして良い記事があったらはてなブックマークでブックマークしましょう! try! Swift の記事で盛り上がると嬉しいです!