今朝起きるとBuild 2017の2日目にXamarin Live Player(以降XLPと省略します)という技術が発表されていたので、今日はその仕組みについて想像していました。
5/12 午前
この時点では、どうやらXLPは「Mac不要でiOSアプリをビルドしてデバッグできる」技術らしいと把握していました。
「またまた皆騙されちゃってー、iOSアプリをビルドするならMacは必要、見えないところにいるだけでしょう」と想像した図がこちら。
Xamarin Live Playerについて、まだ何も試せてないけど多分こんな仕組みじゃないかな(iOSアプリの場合) pic.twitter.com/EHx7O26IN7
— ざまりん.ふぉーむずマン👀 (@ticktackmobile) 2017年5月12日
断っておくとこの想像図は間違っています。(そもそも「iOSアプリをビルドする技術」という理解が間違っている)
一応、この想像図について解説すると
iOSアプリのビルド
現在でもmachinecloudのようなMacを貸し出すクラウドサービスやVisual Studio Mobile Centerを利用することで手元にMacマシンが無くてもiOSアプリをビルドすることが可能です。
iPhoneへのアプリの配信
MicrosoftはHokkeyAppというサービスを持っていて、その中にはテスト用アプリの配布機能も含まれます。iPhoneへのアプリ配布もできそう。
デバッグ
以前からwi-fi経由でのリモートデバッグは可能でした。
とまあ、既存技術の組み合わせでできそうな気がしました。間違ってるんですけどね。
5/12 午後
新しい情報を得て考えを改めます。
@ticktackmobile クラウドでビルド、しているように見えました? 多分していたらxibもaxmlもサポートできると思うんですけど、limitationsだし、全部コードで書いている場合だけ動かせるのが現状だと思うんですよね
— Atsushi Eno (@atsushieno) 2017年5月12日
Xamarin Live Playerって、iPhone上でXamarinプログラミングできるContinuousにリモートデバッグ機能がついた感じなのかなぁ。 https://t.co/jBks1GJImJ
— くれぃんKengo Tsuruzono (@_crane_) 2017年5月12日
はい、現時点でこれが一番正解に近いツイートです。Continuous知ってる人がいてうれしみ。 https://t.co/Byq3Kg30z3
— Atsushi Eno (@atsushieno) 2017年5月12日
ここでXLPの制限事項の存在を認識します。
Xamarin Live Playerの制限事項
Xamarin公式のGuidesによると、主だった物として以下のような制限がある模様。
- Android: AXMLファイル(Xamarin.AndroidにおけるAndroidリソースの拡張子)がサポートされません。
- iOS: storyboadの一部の機能やXIBがサポートされません。
- サブクラスの実装ができません(?)
なるほど、リソースやレイアウトファイルはビルド時にAndroid/XcodeのSDKによって処理されていたはずです。 これらがサポートされないということはXLPではアプリをビルドしないと考えるべきでしょう。
Continuous
ContinuousはiOS上で動作するC#、F#用のIDE(統合開発環境)です。 iPadやiPhoneで書いたコードがその場で実行できるわけです。
ところで、iOSアプリでは実行時コンパイルができません。そのためContinuousは読み込んだコード解析して、それを再現する処理を実行しているはずです。
つまり、こんなコードを書かれた場合
// ユーザーが各コード UIlabel label = new UILabel(); label.Text = "hello world";
このようなコードに相当する処理を実行しているということです。
// Continuousが実行する処理 object variable = Activator.CreateInstance(Type.GetType("UILabel")); Type.GetType("UILabel").GetProperty("Text").SetValue(variable, "hello word", null);
ユーザーがどのクラスを使用するか不明なため、主要なライブラリはアプリに同梱しておく必要があります。その証左としてContinuousのアプリサイズは201MBあります、かなり大きいですね。
さて、話をXamarin Live Playerに戻します。
制限事項より、Android/XcodeのSDKを使ってビルドされたアプリケーションパッケージが実行されていないことが読み取れました。ということは、Visual Studioで書かれたソースコードはContinuousのようにインタープリタ形式で実行されていると考えられます。
ならば、XLPのiOS版アプリは通常よりもはるかに多きいサイズであるはず。 (補足:通常のXamarin.iOSアプリでは参照されないクラスを削ってサイズを小さくしている)
実際 197MB ありました。うん、これはもう間違いなくContinuousと同じ仕組みですね。 (ちなみにAndroidはアプリと別にライブラリをインストールできるし、実行時にコンパイルできるのでもっと小さいです、30MBくらいだそうな)
まとめ
- XLPはVisual Studio(for Mac)から転送されたソースコードをインタープリタ形式で実行している。
- Android/Xcode SDKを使ってビルドしないので通常のXamarinアプリとはできることがかなり違う。
- 動作する仕組みも違うので実機デバッグの代わりにはならない。
- 系譜としてはむしろXamarin Workbookのような一種のplaygroundに近い気がする。
- 身もふたもない言い方をすると強化されたGorilla Player。
- デバッグ可能な点は新しい。
- 通常のアプリ開発に必要な開発端末のセットアップ無しでXamarinのコードを(制限付きで)実行できるのはちょっとうれしい。
- XLPでiOSアプリを作ることはできない。もちろん公開もできない。
- Macを買わずにWindowsだけでiOSアプリをリリースできるなどという妄想は捨てる。
ちなみに、この記事を書いている時点でもまだXLP試せてません。何しろコレなもので。
やったぜ pic.twitter.com/UQ84GNUIAq
— ざまりん.ふぉーむずマン👀 (@ticktackmobile) 2017年5月12日