読者です 読者をやめる 読者になる 読者になる

Swift on Android | try! Swift Tokyo 2017 #tryswiftconf Day1-2

twitter.com

この講演ではSwiftがAndroidでどのように動作するかという概念とどのようにすればSwiftをAndroidで動かせるかということをご説明します。前半はどのようにコア言語としてのSwiftをAndroidで動作させるのかということをAndroid NDKへの入門も含めてお話します。後半はAndroidでSwiftを使う際のライブラリや(リリース可能な)アプリの書き方をお話します。ネイティブのAndroid APIのことだけでなくSwiftでクロスプラットフォーム開発(iOS, Mac, Linux, Windows?)をするための興味深いアイデアについても議論したいと思います。

Swift on Android

f:id:niwatako:20170302102528j:plain

こんにちは。

なぜSwift on Androidなのか

f:id:niwatako:20170302102550j:plain

クロスプラットフォームの有用性はご存知だと思います。

f:id:niwatako:20170302102624j:plain

読まないで下さい

正直に話します

f:id:niwatako:20170302102643j:plain

自分の話は信じられるのかと思われるかもしれないが

f:id:niwatako:20170302102658j:plain

私はアンドロイドエンジニアで、またCocoaの熟達したエンジニアです。

衛星の打ち上げ?に関わったりしていました。

サイエンティフィックビジュアリゼーションがわたしの専門です。

当時Windowsは不安定でMacGUI

f:id:niwatako:20170302102751j:plain

f:id:niwatako:20170302102752j:plain

f:id:niwatako:20170302102753j:plain

f:id:niwatako:20170302102840j:plain

LuaCocoaのブリッジを初めて作りました

f:id:niwatako:20170302102857j:plain

f:id:niwatako:20170302102902j:plain

ということで言語の橋渡しについては熟達しています

Android開発の必要がありSwiftでAndroidアプリを、おそらく初めてくくりました。

f:id:niwatako:20170302102924j:plain

f:id:niwatako:20170302102945j:plain

やるべきことだけではない、コンセプトのお話をします。

たとえばandroidの場合はUnixLinuxを考えるなどの比喩を通して基本的なことを理解して下さい。

f:id:niwatako:20170302103034j:plain

Cは移植性が高くABIが安定しています。あらゆる全ての言語がCと通信が可能です。ということでCには何度も触れます。

Swift on Andoridでもそれ以外の言語でも、言語とライブラリの区別をすることが大事です

f:id:niwatako:20170302103121j:plain

UIKitはAndroidに移植されることはないでしょう。

SwiftのCoreのみが重要なんです。Intやランタイム以外はオプションです。

f:id:niwatako:20170302103217j:plain

f:id:niwatako:20170302103253j:plain

アプリとしてリリースできるものには余分なものは入っていません。エンドユーザーがソースコードからコンパイルすることを期待してはいけません。

f:id:niwatako:20170302103330j:plain

最後の二つは間違っています。

正しいやり方でお話をしたいと思います。

f:id:niwatako:20170302103400j:plain

AndroidAppはJavaSDKを使う必要がありましたがGameデベロッパーの要望に答えC/C++などのライブラリが登場しました。

f:id:niwatako:20170302103439j:plain

NDKは残念ながらお粗末です

f:id:niwatako:20170302103515j:plain

かれらはセガサターンにさえ文句を言わないのに文句を言っている。NDKはAndroidにおいては2級市民でお粗末、Googleには担当者が2人しか居ません。

公にこうして批判するツールが残されたツールです。

f:id:niwatako:20170302103604j:plain

f:id:niwatako:20170302103619j:plain

Luaは組み込み可能な言語です。移植性に優れています。1つのコードベースでAnsiCに完全互換です。

1990年向けコードベースを修正すること無く実行できます。モダンNDKでやってみましょう、ビルドに失敗します。

f:id:niwatako:20170302103710j:plain

AndroidのCライブラリは様々なコードからでてきたものが混ざっています。

f:id:niwatako:20170302103803j:plain

f:id:niwatako:20170302103818j:plain

ダイナミックライブラリの挙動にも非常に不安定な部分があります。

f:id:niwatako:20170302103854j:plain

これが特別に対応されたクロスプラットフォーム対応プログラムを必要とする理由です。

C++でライブラリを作らないという教訓が人が減って伝えられていないようです

f:id:niwatako:20170302103944j:plain

f:id:niwatako:20170302103956j:plain

NDKで問題が顕在化します。

f:id:niwatako:20170302104018j:plain

バンドリングされないのでみなさんでバンドリングが必要です

f:id:niwatako:20170302104053j:plain

人々は彼らのNDKをアップグレードしたりしていないので様々なNDKバージョンが混在し、全ての異なるC++標準ライブラリを含まなくてはいけないことになる。

f:id:niwatako:20170302104140j:plain

f:id:niwatako:20170302104142j:plain

f:id:niwatako:20170302104159j:plain

f:id:niwatako:20170302104201j:plain

パッチを送ったが結局採用されなかった

f:id:niwatako:20170302104234j:plain

f:id:niwatako:20170302104235j:plain

f:id:niwatako:20170302104236j:plain

libICUはC++ライブラリで書かれていてアンドロイドが内蔵している可能性がある。自分のライブラリと一緒にローソしようとした時何もしない形になってしまう。OSはロード済みと扱うため。しかしバージョンはマッチしない。ICUを使う時にクラッシュが起きる。

f:id:niwatako:20170302104401j:plain

f:id:niwatako:20170302104406j:plain

f:id:niwatako:20170302104414j:plain

AndroidでSwiftを使うということにやっとなるが、AndroidAppは全てAndroidSDKを使わなければいけません。JavaでスタートしてCを経てSwiftに入る必要があります。

f:id:niwatako:20170302104449j:plain

必ず最初にActivityが必要です。onCreateをスタートポイントにします。

順番が重要です。依存性を全てロードして、それからSwiftで書かれたものをロードします。

f:id:niwatako:20170302104542j:plain

f:id:niwatako:20170302104602j:plain

f:id:niwatako:20170302104617j:plain

ここでCに入ります、ここからSwiftに入る必要があります。

f:id:niwatako:20170302104627j:plain

f:id:niwatako:20170302104658j:plain

もう一つコツが有ります。イベントループをブロックしてはいけません。

Swiftをアプリの中でどう使うか考えておく必要があります。

バックグラウンドスレッドを作ることもできますが、何のためにするか分かっていなければ、トラブルが増えるので推奨しません。

あとで読んで下さい。

f:id:niwatako:20170302104836j:plain

f:id:niwatako:20170302104837j:plain

ただし注意、staticとGlobal変数の初期化には注意して下さい。

f:id:niwatako:20170302104844j:plain

Global変数が初期化されたりされなかったりすることがある。ダイナミックライブラリがメモリを残していれば消えていないので、前回のあたいが残っている。

f:id:niwatako:20170302104920j:plain

f:id:niwatako:20170302104959j:plain

今のところはこのようなパターンが必要な場合は手動で初期化してください。

このTweetには共感します。

f:id:niwatako:20170302105033j:plain

f:id:niwatako:20170302105042j:plain

ビルドシステムがぜんぜん違う。

f:id:niwatako:20170302105054j:plain

どうするか。

Swift Package Managerは使えないと思う。自分でやるのは難しい。

CMake

f:id:niwatako:20170302105130j:plain

AndroidStudioの一部として採用されると発表された

Swift対応中

こんなスクリプトです。

f:id:niwatako:20170302105208j:plain

f:id:niwatako:20170302105226j:plain

SwiftでAndroidは出来るか?出来るが困難。

f:id:niwatako:20170302105237j:plain

JNIを通らなくてはいけない、すべてを使えるわけではない。ただ様々なソリューションはある。JNIをカプセル化していく。

f:id:niwatako:20170302105342j:plain

基本的にあらゆるプラットフォームにCライブラリが有り、あればSwiftから使える。これらを使えばSwiftでクロスプラットフォームが出来る。

これはFlappy Birdのクローンです。

f:id:niwatako:20170302105414j:plain

クロスプラットフォームで利用できます。

f:id:niwatako:20170302105451j:plain

GUIはどうでしょう。Nuclear

f:id:niwatako:20170302105456j:plain

Open GLがよく使われるがそれ以外にも対応できる

f:id:niwatako:20170302105526j:plain

デザインに関しては様々なスクリーンサイズを念頭に置く必要があります。

f:id:niwatako:20170302105611j:plain

Cocoaクロスプラットフォームで使えればと思うでしょう、様々なプロジェクトが有りましたが殆どが夢半ばです。

f:id:niwatako:20170302105627j:plain

その中でもIUPがおすすめです。

f:id:niwatako:20170302105658j:plain

f:id:niwatako:20170302105704j:plain

Cで書かれていて言語バインディングが念頭に置かれている。LEDでコードと言語を区別している。

f:id:niwatako:20170302105744j:plain

プラットフォームの違い、オブジェクト指向言語を使っていないということも想定している。

f:id:niwatako:20170302105821j:plain

Cの弱い型システムに向けてプロトコル指向です。

GTKWindows用はあるがMac用は無い。

f:id:niwatako:20170302105858j:plain

f:id:niwatako:20170302105908j:plain

でも私たちはCocoaの専門家なので作ることができます。

Mobileは?

f:id:niwatako:20170302105957j:plain

f:id:niwatako:20170302110023j:plain

ボタンを押すとウィンドウが新しく出来るプログラム

f:id:niwatako:20170302110050j:plain

f:id:niwatako:20170302110117j:plain

f:id:niwatako:20170302110118j:plain

NavigationControllerとViewControllerを利用

f:id:niwatako:20170302110132j:plain

ダイアログをアクティビティにマッピング

f:id:niwatako:20170302110138j:plain

Windowsでも!

f:id:niwatako:20170302110216j:plain

f:id:niwatako:20170302110227j:plain

ビルドのシステムチャレンジをBlurrrが解決

f:id:niwatako:20170302110313j:plain

f:id:niwatako:20170302110315j:plain

非常に真剣に取り組んでいます。

f:id:niwatako:20170302110326j:plain

軌道に載せたいので支援が必要です。ハッカソンではゲームワークショップを行います。

f:id:niwatako:20170302110357j:plain

わたしの師です。

f:id:niwatako:20170302110359j:plain

昨年亡くなってしまいました。

f:id:niwatako:20170302110437j:plain

f:id:niwatako:20170302110438j:plain

f:id:niwatako:20170302110439j:plain

f:id:niwatako:20170302110440j:plain

亡くなってしまったのでTwitterが更新されなくなってしまいました

一緒にプロジェクトを進めたいと思っていました。でもタスクがいろいろあって優先順位を高く進めることができませんでした。

クロスプラットフォームSwiftを可能にしたのは彼の力によるところが多いわけです。

f:id:niwatako:20170302110738j:plain

f:id:niwatako:20170302110739j:plain

f:id:niwatako:20170302110740j:plain f:id:niwatako:20170302110741j:plain f:id:niwatako:20170302110742j:plain f:id:niwatako:20170302110743j:plain f:id:niwatako:20170302110744j:plain f:id:niwatako:20170302110745j:plain f:id:niwatako:20170302110746j:plain

Q&A

最初の点について、Appleがどのくらい悪いのか

私が仕事した会社ではAndroidのほうが4〜10倍難しいですね

たとえばSwift Androidのプラットフォーム間の違い、マネジメント例えばメモリ管理

SwiftはNDKを使います。ここでAndroidのメモリマネジメントは、Javaは完全に管理されていて、人工的なメモリリミットをAndroidアプリに課している。NDKを使えばあらゆるメモリを使うことが出来る。RAMはiOSよりも通常多いです。