Swift on Android | try! Swift Tokyo 2017 #tryswiftconf Day1-2 聞き起こし

twitter.com

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?)をするための興味深いアイデアについても議論したいと思います。

スライドは参加者Slackにあります

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の熟達したエンジニアです。

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

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

当時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(Android Native Development Kit=C/C++用公式Android開発ツールセット)は残念ながらお粗末です

f:id:niwatako:20170302103515j:plain

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

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

f:id:niwatako:20170302103604j:plain

f:id:niwatako:20170302103619j:plain

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

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

Blurrr SDK Open Beta | Blurrr SDK

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

f:id:niwatako:20170302105451j:plain

GUIはどうでしょう。Nuklear

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

www.youtube.com

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よりも通常多いです。

みんなの反応

もっと反応を見る

togetter.com

気に入った記事は はてなブックマーク

はてなブックマークアプリiOS開発チームから来ました! はてなブックマークにはSwift特集があります! 良い記事を見逃さないように、ご利用ください! http://b.hatena.ne.jp/hotentry/it/Swift

そして良い記事があったらはてなブックマークでブックマークしましょう! try! Swift の記事で盛り上がると嬉しいです!