インサイドXamarin(1)
Xamarinを構成するソフトウェア。その主要な10要素とは?
Xamarinは何を提供しているのか? その主要なソフトウェア構成要素として、Mono、Gtk#、MonoDevelopとXamarin Studio、Xamarin.iOS、Xamarin.Android、Xamarin.Mac、Visual Studioアドイン、Xamarin.Forms、Xamarinコンポーネント、Xamarin Test Cloudなどについて紹介。
はじめに
今回、Xamarinについて記事を書かせていただくことになった。Xamarin(カタカナで書けば「ザマリン」となるだろうが、何と読もうが皆さんの自由だ)は、iOSおよびAndroidを中心に.NET/C#を活用するモバイル開発フレームワークを開発・販売している米国の会社であり、同社が販売している一連の製品に冠せられた名前でもある。同社のチームは、10年以上前からオープンソースのクロスプラットフォームである.NET Framework互換環境「Monoプロジェクト」を開発してきた。同社の製品は、その高い移植性を活用して、.NET互換環境をモバイルの世界に持ち込んだものといえる。
2013年11月に、Xamarinはマイクロソフトとの提携を大々的に発表した。それ以来、日本でもXamarinに関するセミナー、セッションや記事を多く見かけるようになった。Xamarinを使用した開発に関する分かりやすい入門資料が広まっているので(このBuild Insiderでも公開されている)、筆者は少し異なる視点から、Xamarinおよびその製品がどのような背景をもって作られているのか、理解が深められるよう、詳しく紹介していきたい。
本連載の第一稿は2013年に執筆し、その年末~2014年に公開されたものだが、Xamarinはその後、2016年にマイクロソフト社に買収されており、現在では同社の一部として存続している。また、Xamarinを買収したマイクロソフトは、「Xamarinプラットフォーム」と呼ばれるSDK相当の部分をオープンソース(MITライセンス)で公開した。これらは大きな変化といえる。
なお、筆者はXamarinの開発メンバーとして、主にAndroid製品の開発に携わっており、さらにはどちらかといえばMonoの開発に従事してきた経験が長いので、それらに関する内容が比較的多くなると思われる。そこは了解いただきたい。
Xamarin(企業)について
Xamarin社について軽く紹介しておきたい。Xamarinは、もともとはMiguel de IcazaをリーダーとするMonoプロジェクトの開発メンバーが集まって、2011年に独立した会社として結成されたものである。結成後ほどなく、彼とかつてGNOMEデスクトップの開発のためにともに起業したNat FriedmanをCEOとして迎え、米国ボストンおよびサンフランシスコにオフィスを構えており、2013年末の時点で社員は100人強のメンバーから成っている。メンバーの多くは米国にいるが、もともとオープンソースのハッカーをメンバーとしていることもあり、筆者のようにリモートで参加しているメンバーも少なくない。
ちなみに、彼らがリードするチームは、伝統的にサルがお気に入りで、Miguelが名付けた「Bonobo」「Ximian」「Mono」は全てサルに由来する(Ximianは類人猿を意味する「simian」から。Monoはスペイン語で「サル」の意)。Xamarinも「tamarin」から来ている。もし米国Xamarinのイベントに参加したり、パートナーシップを結んだりすることなどがあれば、Xamarinから謎のマスコットキャラクターが贈られることもあるかもしれない。
神奈川県座間市のマスコットキャラクター「ざまりん」とは全く関係がない。
Xamarinを構成するソフトウェア
Xamarinは、全体的に、.NETプラットフォームを前提とした一連のソフトウェアを開発・提供している。その動作環境にはWindowsもMac OS Xも含まれ、独自のIDE(統合開発環境)である「Xamarin Studio」の他に、Microsoft Visual Studioもサポートしている(対応バージョンは2010~2013で、Expressエディションを含まない)。これらを実現しているのは、さまざまなソフトウェア構成要素である。いくつか名前を挙げていこう。
あらかじめお断りしておくが、ここで説明するのはソフトウェアの構成要素であり、販売されている「製品」の説明ではない。
1Mono
Monoは.NET Framework互換環境をクロスプラットフォームで実現する、Xamarin製品の中核をなす存在だ。Monoは、共通言語ランタイム(CLR)、C#コンパイラ、そして膨大な.NETのクラスライブラリから成る。
ランタイム“mono”は、CIL(共通中間言語)メタデータのパーサー、JITエンジン、ガベージコレクターなど、.NETプログラム実行に必要な機能の大半をすでに実装している。さらに、IronPythonやIronRubyなどの動的言語も動かせる(これらがアクティブにリリースされていたころは、新バージョンが公開されるたびに、monoランタイム上で実行することにより発見されたバグが、直ちに修正されていた)。monoはC言語で書かれており、ライブラリとしてアプリケーションが利用できる組み込みAPIも公開している。
C#コンパイラ“mcs”は、2013年末の時点で、async/awaitキーワードや呼び出し元情報(caller info)など、C# 5.0の機能を全て実現している。mcsはC#言語で書かれており、そのコードは他のプロジェクトでも再利用されている。
クラスライブラリは、ECMA 335で標準化されている部分を中心に、主にWindows固有ではない部分が多く実装されている。かつてはWindowsフォーム(Forms)なども実装していたので、これはLinuxのX11環境や、Mac OS X環境でもそこそこ動作する。
Monoは、Windows上でも動作する(.NET Frameworkに依存することなく動作する)。実装のアーキテクチャとしてはJavaに近いと言えよう。ただし標準的な環境では、.NET Frameworkのように、.exeファイルをシームレスに実行することはできない。
2Gtk#
Monoプロジェクトは、歴史的にはLinuxのGNOMEデスクトップ上で.NETアプリケーションの開発を容易にするために始められたものであり、GNOMEのGUIツールキットである「Gtk+」と緊密に結び付いている。Monoを使用して開発されたアプリケーションの多くは、そのGtk+の.NETバインディングである「Gtk#」を使用して開発されている。
Gtk#のアーキテクチャは、.NETにおけるWindowsフォームのアーキテクチャと大きく変わらない。Monoではネイティブコードとの相互運用を実現するP/Invoke(platform invoke、日本語にすると「プラットフォーム呼び出し」と言うべき機能だが、これでは伝わらないだろう)がサポートされており、Gtk#はこのP/Invokeを使用してGtk+のAPIを呼び出している。WindowsフォームはWindows APIをP/Invokeしている(はずだ。Mono on WindowsのWindowsフォームバックエンドの実装はそうなっている)。
3MonoDevelopとXamarin Studio
.NET開発の重要な要素として、Visual Studioという卓越したIDEがある。Monoは.NET Frameworkの互換環境を目指しているので、Linux上でMonoアプリケーションを開発するときにも、同様に使えるIDEがあることが望ましい。
.NET Framework 1.0が公開された当初、Windows上にはすでに、「SharpDevelop」というフリーソフトウェアのIDEが存在していた。当然ながら、Visual Studioのように広範な機能を備えていたわけではなく、主に.NETのプロジェクトモデルとC#コードエディターをサポートするための存在だった。Monoコミュニティに、「このSharpDevelopをGtk#でMonoに移植しよう」というハッカーがいて、彼はわずか2カ月で、Windowsフォームベースで作られていたSharpDevelopの機能の大半を実現してしまった。
このプロジェクトは「MonoDevelop」と名付けられ、やがてNovellのハッカーが引き取って開発が継続されることになる。もっとも、その後、そのコードベースはSharpDevelopとは全く異なるものになった。MonoDevelopとSharpDevelopは提携し、リファクタリング・エンジンなど、コードを共有していた(現在はMonoDevelopはリファクタリング・エンジンにRoslynを使用しており、共有コードがどれほど残っているかは分からない)。SharpDevelopの当初のリーダーも含め、SharpDevelop開発者の何人かはXamarin Studioのチームに在籍している。
MonoDevelopが前提としているGtk#は、そのネイティブ層であるGtk+が長らくUNIX互換環境専用であったために、他のOSで動かすことは前提としてこなかったが、やがてWindowsやMac OS Xでも動かす猛者が登場し、2013年末現在では、かなりの部分がクロスプラットフォームで動作するようになっている。MonoDevelopも、このGtk+がクロスプラットフォーム化していくのに伴って、GNOME依存部分を削り落として、クロスプラットフォームIDEとして、Mac OS XやWindows上でも動作するようになった。そしてUnityのような、外部のソフトウェア企業でもバンドルされていくようになる。
MonoDevelopは、以上のように、歴史的にGtk#の上に設計されている。MonoDevelopを使っていて違和感のあるユーザーインターフェース部品は、概ねGtk+の制約といえる。
MonoDevelopは現在でもオープンソースで開発されている。Xamarin Studioは、このMonoDevelopの上に、Xamarin製品をサポートするアドインを上乗せしたものだ。基本部分はMonoDevelopと何も変わらない。AndroidやiOSの開発に必要な諸機能が、このアドインとして実現されている。
4Xamarin.iOS(旧: MonoTouch)
さて、ここまで長い前置きのようなものになったが、ここからモバイルの話になる。Monoの特徴の1つとして、「C言語で書かれていて、組み込みAPIを提供している」という側面がある。かつては、この機能を利用して、Maemo(そしてMeego)といったLinuxベースのモバイル環境上でMonoを実験的に動かしていたユーザーもいた。
そして2006年、iPhoneが登場した。当初は「iPhoneのアプリはAJAXだ」と言われていたものだが、2008年にiPhone SDK(現在のiOS SDK)が公開されると、MonoハッカーがiPhone上でMonoを動かすようになった。iPhone SDKで使用されるのは独自言語のObjective-Cであり、gccでCのライブラリをビルドすることができた。このSDKでMonoをビルドし、iPhone SDKのAPIを取り込んで、iPhone SDKに親和的な形で.NETのAPIにバインドするプロジェクトが、Mac方面を担当していたMonoハッカーから立ち上がった。
これが、同2008年の晩秋には、「MonoTouch」という製品となって、Novell社から販売されることになった。さらに、このObjective-CとMonoを結ぶテクノロジーは、後述する「Xamarin.Mac」という製品の基盤にもなっていく。
MonoTouchの名称は、2013年に「Xamarin 2.0」という大きなリリースに合わせて、「Xamarin.iOS」に変更された。それと同時に、Visual Studioによる開発もサポートしている(アプリケーションの実行にはMac環境が必要になる)。
Xamarin.iOSは、C#のコードや.NETのMSILをObjective-CやCのコードに置き換えるものではない。C#のコードは普通にDLLファイルにコンパイルされ、iOSデバイス上では、DLL上のコードはmonoランタイムのAOT(Ahead of Time compilation: 事前コンパイル)技術によって、直接、ターゲット(arm)のCPU命令バイナリに変換されて実行される(iOSシミュレーターはx86なので、これは当てはまらない)。
5Xamarin.Android(旧: Mono for Android、MonoDroid)
MonoTouchの製品化に成功したMonoチームは、その間に登場したAndroidについても、同様の開発環境を構築できるよう、「MonoDroid」と呼ばれるプロジェクトを立ち上げた。Androidの開発は、iPhoneとは全く異なり、Android SDKはJavaで提供されている。その他に、ネイティブコードをビルドするためのAndroid NDK(Native Development Kit)があり、これもgccでCのライブラリをビルドできる。monoランタイムはこれでビルドしている。
AndroidのAPIはJavaであり、ネイティブレベルで呼び出しが可能なObjective-Cに基づくXamarin.iOSとは仕組みが大きく異なる。Androidでは「JNI(Java Native Interface)」という仕組みでネイティブコードを呼び出せるので、MonoDroidはこれを活用してJavaとの相互運用を実現した。
MonoDroidはその後、“Droid”にかかる商標上の懸念から、販売前に「Mono for Android」という名称に変更され、さらにXamarin 2.0のリリースに伴って「Xamarin.Android」と改名されている。
Xamarin.Androidも、Xamarin.iOS同様、MSILをJavaのバイトコードに置き換えるものではない。Android上で動作するMonoのJITコンパイラがMSILをネイティブCPU命令(armなりx86なり)に変換して実行する。この挙動はXamarin.iOSとは異なる。Xamarin.Androidでは、AndroidのJava VMであるDalvikあるいはARTと、mono VMが並列動作している。
6Xamarin.Mac(旧: MonoMac)
Monoは本来、ECMA CLIとC#の実装としてスタートしている。GUIアプリケーションはECMAの仕様範囲外であり、Windowsフォームの実装は、.NETアプリケーションをLinux上でも使えるようにするために行われたものだった。その後、MonoがMac OS Xで動作するようになり、Macのマーケットシェアが拡大して、Mac用アプリケーションの開発という需要が新たに発生することになった。
デスクトップ・アプリケーションの開発には、共通のGUIフレームワークを使うこともできるし、WindowsフォームもGtk#も使用できるのだが、どうしても不整合な部分が生じがちになる。Gtk+がMacで実用できるようになったのは比較的最近のことで(特に日本人にとっては、2013年まで日本語入力ができなかったのは大きな問題だろう)、WindowsフォームはWindows上でも終えんを迎えつつある。最初からCocoaを使用してMac用アプリケーションを開発したいという要求が高まった。
Monoコミュニティでは、古くからさまざまなMac OS APIのバインディングの試みがなされてきたが、やがて、MonoTouchの開発で得られた知見を基に作られた、「MonoMac」と呼ばれるバインディング、さらにそこにプロプラエタリ・コードを追加して商品化したXamarin.Macが主流となった。Objective-Cのライブラリと親和的で、Objective-Cのクラスから派生してメンバーをオーバーライドするようなコードが書ける。
Xamarin.Macは、2016年にマイクロソフトがXamarinを買収した直後にオープンソース化されて公開された。
7Visual Studioアドイン(Add-in)
Xamarinのもう1つの重要な構成要素が、Visual Studioのサポートだ。Xamarin.iOSやXamarin.Androidは、それ自体はMonoを利用したツールチェーンであって、これらにはIDEサポートはほとんど含まれていない。
Visual Studioサポートは、「Visual Studio SDK」というVisual Studioのアドイン開発ツールを使用して作られていて、この中には例えば外部デバッガーとVisual Studioのインスタンスを接続して、Visual Studio上でデバッグを実現することもできるようになっている。
さらに、Xamarin.Androidでは、Eclipseに搭載されているようなGUIデザイナーがサポートされているし、Xamarin.iOSでも、XcodeのInterface BuilderのようなGUI設計がサポートされている。これらはそれぞれ高度なトリックを使っていて、それぞれ個別に掘り下げる価値がある機能だが、それとは別に重要なのが、それぞれXamarin Studioでも使えて、かつWindowsでもMacでも使えるという点だ。これは、Xamarinが開発している、「Xwt」というクロスプラットフォームの共通デスクトップGUIフレームワークを使用して実現している。
なおVisual Studioは、Expressエディションではアドイン機構が有効になっていないので、ExpressではXamarin製品を使用できない。
8Xamarin.Forms
Xamarin.iOSおよびXamarin.Androidを使用すると、プラットフォームに固有のAPIに、.NETらしい形でアクセスできる。Xamarinの根本的な発想は、.NET開発者に、プラットフォームのネイティブ開発のメリットを最大限に生かしてもらうために作るものであり、プラットフォーム・ネイティブのAPIアクセスこそが完成度の高いモバイルアプリケーションを成功させるものである、という哲学に基づいている。
しかし、プラットフォーム固有のAPIは、当然ながら対応するプラットフォームでしか使用できない。モバイルプラットフォームのユーザーインターフェース機能は、それなりに重複している部分があるのだから、簡単なものであれば共通化して、コードを再利用したい、と考えるのも理解できる。
Xamarin.Formsは、そのような需要に応えるべく開発されたものだ。Xamarin.Formsは、ネイティブAPIへのアクセスを確保しつつ、クロスプラットフォームのGUIを実現している。そして、その基盤はMVVM(Model-View-ViewModel)パターンを自然に実現できるような設計になっており、XAMLのテクノロジーも活用されている。
9Xamarinコンポーネント
もう一つ言及しておきたいのが、Xamarinをターゲットとするコンポーネントの存在だ。Xamarinプラットフォームで使用できるライブラリやコンポーネントは、NuGetにも数多く登録されている。
また、Xamarinではコンポーネントストアというマーケットも開設されており、Xamarin製およびサードパーティ製のコンポーネントが多数登録されている。ここでは、Xamarinの登録ユーザーが独自のコンポーネントを登録して販売することもできる。
Xamarinのコンポーネントストアに登録するためには、ドキュメントや(通常は)サンプルプロジェクトも要求される。逆にコンポーネント・ユーザーの視点では、ここに登録してあるコンポーネントの詳細ページなどを見ると、コードの使い方などがWeb上で確認でき、Web上でAPIリファレンスも参照できる。
なお、マイクロソフトによるXamarin買収に伴い、それまでクローズドソースで配布されていたXamarin製コンポーネントの大半が、オープンソース化されてGitHubで公開されている。
10その他
Xamarinは、基本的なプラットフォームとIDE機能の他にも、開発をサポートするためのソフトウェアをいくつか公開している。
最も大規模なものは、多数のデバイス・プロファイルに対するテストを全面的に支援するXamarin Test Cloudだろう。これは、多種多様な機種を誇るAndroidにおいてしばしば難問となる、「特定のデバイスでのみ発生する問題」を分析できるようにするために開発されたサービスで、もともとはLess Painfulという会社が開発した、CalabashというUIテストのためのライブラリを使用したものだった。Xamarinは2013年にLess Painfulを買収し、それまでRubyによって実現していたテストスクリプト作成環境を.NETでも実現している。
また、Xamarin環境におけるクラッシュレポート分析などのアナリティクスを実現するXamarin Insightsという製品も存在していた。これはマイクロソフトで類似の機能を実現していたHockeyAppと統合されることになる。
他にも、アプリケーションのパフォーマンス分析に使用されるXamarin Profilerや、実行中のアプリケーションの状態を分析するXamarin Inspectorなど、さまざまな開発者支援機能が提供されている。
近年ではあまり見なくなったが、Xamarinでは実験的なプロジェクトが走っていることもある。例えばXamarinは設立1周年を迎えたころに、AndroidのJava部分を完全にC#に置き換えた「XobotOS」というリサーチ・プロジェクトを発表し、ソースコードを全てオープンソースとしてGitHubで公開したこともある。
Xamarinの開発者サポート
Xamarinのソフトウェアの大部分はMonoに由来しているが、企業としてのXamarinはMonoプロジェクトとはかなり毛色が異なる。Xamarinには常任のドキュメント作成チームがいて、常に豊富なドキュメントを整備している他、ドキュメンテーションの一環として、サンプルとなるアプリケーションやネイティブのサンプルコードをいくつも移植している。Mono、特にクラスライブラリやC#コンパイラは、.NET Frameworkと互換であり、APIリファレンスもMSDNと重複することにもなるため、それらに関するドキュメントの量は相対的に少ない。
また、サポートチームも存在していて(ただしXamarin本体は米国にのみオフィスを構える企業なので、サポートは英語のみになる)、そこにはXamarinのユーザー・コミュニティからヘッドハンティングされて参加するようになったメンバーも何人かいる。
この他に、Xamarinでは、「Xamarin University」という、オンラインのトレーニング・クラスも有償で開講しており、これでXamarin製品の使い方を習得することもできる。さらに、不定期的にオープンなWebinar(=Web上のセミナー)を開いている。これはストリーミングで視聴できるセッションで、誰でも参加できる。開催は公式サイトのBlogやTwitterアカウント(@xamarinhq)で告知される(全て英語で行われていることに注意)。
次回以降
今回はXamarinが何を提供しているのかを大まかに説明した。次回以降は、各論として、それぞれのソフトウェア構成要素について掘り下げて説明することとしたい。
※以下では、本稿の前後を合わせて5回分(第1回~第5回)のみ表示しています。
連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。
1. 【現在、表示中】≫ Xamarinを構成するソフトウェア。その主要な10要素とは?
Xamarinは何を提供しているのか? その主要なソフトウェア構成要素として、Mono、Gtk#、MonoDevelopとXamarin Studio、Xamarin.iOS、Xamarin.Android、Xamarin.Mac、Visual Studioアドイン、Xamarin.Forms、Xamarinコンポーネント、Xamarin Test Cloudなどについて紹介。
2. Xamarinの基盤となっている「Mono」と、C#コンパイラー「mcs」
Xamarinにおけるソフトウェアの基盤であるMonoを深く理解すれば、Xamarin製品の理解はもっと深まる。今回はMonoの成り立ちから、そのソフトウェア構成、C#コンパイラーの内容までを解説する。
3. Xamarinの基盤「Mono」のmonoランタイムとクラスライブラリ
Xamarinにおけるソフトウェアの基盤であるMonoを深く理解すれば、Xamarin製品の理解はもっと深まる。今回はmonoランタイムと、Monoのクラスライブラリについて解説する。
4. Monoのモバイル化の流れ ― Xamarin.iOS/Xamarin.Androidの誕生
デスクトップ環境での動作を主眼に開発された「.NET」のオープンソース実装である「Mono」は、どのようにモバイル開発に向かって流れていくことになったのか。