ものがたり(旧)

atsushieno.hatenablog.com に続く

monodroid: FAQ

これは http://monodroid.net/FAQ の現時点での内容の日本語訳、をもとに書いたもの。

基本

MonoDroidとは何ですか?

MonoDroidは、Androidベースのデバイス向けにC#を使ってモバイルアプリケーションを書けるようにしたSDKです。

MonoDroidは2つのAPIの集合を公開します。C#開発者が親しんでいるコア.NET APIと、MonoDroid.*ネームスペースで公開されているAndroidのネイティブAPIC#バインディングです。

MonoDroidを使えば、Androidアプリケーション ストアを通じて配布できるアプリケーションを開発したり、個人的な端末やAndroidエミュレータにソフトウェアをデプロイできます。

MonoDroidには何が含まれているんですか?

MonoDroidには、コアMonoランタイム、ネイティブAndroid APIへのMonoDroidバインディングAndroidアプリケーションを開発するためのVisual Studio 2010プラグイン、アプリケーションのビルドやデバッグやデプロイメントのためのツールを含むSDK、が含まれます。

Visual Studio 2010プラグインでは、Visual Studio 2010を使ったアプリケーションの開発、デバッグAndroidシミュレータやAndroidバイスAndroidアプリケーション ストアへのデプロイメントが可能です。

MonoDevelopの将来のバージョンでは、MonoDroidをサポートします。

MonoDroidアプリケーションを開発するには何が必要ですか?

初回版のMonoDroidプレビューのユーザーは、WindowsマシンとVisual Studio Pluginの使えるVisual Studio 2010 Professional以上が必要です。

そのうち、MacOS XLinux、VS2010の無いWindowsでも、MonoDevelopを使用したMonoDroidのサポートを追加します。

UIデザイナはどこ?

MonoDroidにはUI XMLファイルを作るUIデザイナは入っていませんが、DroidDrawを使うと良いでしょう。

Windowsでは、Visual Studio 2010 Expressを使えますか?

Visual Studio 2010 Expressでは、テンプレートへのアクセスやリモートデバッグVisual Studioからのデプロイメントなどを行うために必要なプラグインが使えないので、利用できません。

Mac/Linux向けのMonoDroidはいつ頃出ますか?

MonoDevelop IDEを使ったLinux/Mac版のMonoDroidの作業は現在進行中です。これはプレビュー3あたりで利用可能になるでしょう。詳しくはRoadmapを見てください。(まだ英語)

MonoDroidのAPI

MonoDroidで公開されているAPIプロファイルは何ですか?

MonoDroidの最初のリリースでは、MonoTouchと同じコアライブラリのAPIプロファイルが使用されています。これはつまり、SilverlightベースのAPIからSilverlightの制約であったサンドボックスの制限を外し、SilverlightにあるUIのコードが含まれないものです。(XAMLサポートとかWindowsBase.dllとか)

わたしはMonoTouchやWindowsPhone 7のアプリケーションを持っているんですけど、Androidをターゲットにしてこれらを再ビルドすればいけるですか?

MonoDroidもMonoTouchも、AndroidiPhone向けに.NETのコア機能を提供しますが、クロスプラットフォームのUIソリューションは提供していません。各OSには独自の、微妙に異なる、UIの構築とか電話とのインタラクションとかアドレス帳とかGPSとかオーディオシステムがあります。

われわれとしては、これら3つのモバイルプラットフォームをターゲットにする開発者には、ビジネスロジックユーザーインターフェース、ハードウェアインターフェースの層は、分けて作ることをおすすめしたいところです。

これはつまり、ユーザーインターフェース層とハードウェア統合のコンポーネントは、各プラットフォーム向けにそれぞれ書かなければならないということです。

ビジネスロジックの部分は、任意のコアAPIを使うことができます: mscorlib, System, System.Xml, System.Core, System.Data, System.Json, System.Runtime.Serialization, System.ServiceModel, System.Web.Services, System.Xml.Linq (注: この中にはWP7では使えないAPIが含まれている)

さらに、OpenGLライブラリへのオブジェクト指向のラッパーであるOpenTK APIもサポートしているので、iPhoneAndroidについては、OpenGLのコードを共有することができます。

コアMonoDroid/MonoTouchライブラリはSilverlight APIのサブセットなので、機能を分解して考えるとよいでしょう。

MonoDroidではどんな.NETの機能をサポートしますか?

最初は、MonoDroidではC#ガベージコレクション、マルチスレッド、Linqその他.NET 3.5のコア機能をサポートするでしょう。

以下のアセンブリがMonoDroid 1.0の構成要素になります:

  • mscorlib.dll
  • System.dll
  • System.Core.dll
  • System.Json.dll
  • System.Runtime.Serialization.dll
  • System.ServiceModel.dll
  • System.ServiceModel.Web.dll
  • System.Web.Services.dll
  • System.Xml.dll
  • System.Xml.Linq.dll

さらに、以下のMonoアセンブリがMonoDroid 1.0に含まれます:

また、以下のサードパーティ アセンブリがMonoDroid 1.0に含まれます:

  • OpenTK.dll
Java.*とSystem.*はどう使い分ければいいの?

Java.*クラスとSystem.*クラスは時々オーバーラップします。MonoDroidは、.NETの世界でJava.*ネームスペースが使えるようにして、ネイティブJava APIを呼び出せるようにしています。

一般論として、MonoDroidアプリケーションをビルドしている時は、あなたのコードの大半の部分では、Java.*クラスではなくSystem.*クラスを使用するべきです。その理由としては、Java.*クラスについては、実際にはオブジェクトの2つのインスタンスが生成されるためです。ひとつはC#の世界でJavaクラスへのproxyとなり、もうひとつはDalvikサイドで実際の機能を実装するのです。Java.*クラスのメソッドあるいはプロパティを呼び出す度に、このコードはMono VMとDalvik VMの間を遷移することになります。Java.*クラスで公開されているサービスは、MonoのSystem.*ネームスペースの世界でも直接利用できるもので(たとえばSystem.Stringとか)、System.*であればパフォーマンス上のペナルティも発生しないのです。

このルールの例外は、特定のJavaクラスのインスタンスを要求する、Android.*あるいはJava.*のメソッドを呼び出す必要がある場合です。

標準のデスクトップのMonoアセンブリや.NETアセンブリをMonoDroidで使用できますか?

MonoDroidでは1.0や2.0のデスクトップ/サーバ用アセンブリを使用することはできません。

MonoDroidで既存の.NETコードを再利用するには、MonoDroidのベース アセンブリで再コンパイルしなければなりません。

特に、MonoDroidのアセンブリをデスクトップ版Monoのアセンブリで置き換えても、軽量版のmonoプロファイルであるMonoDroidには含まれていないAPIが数多くあるので、動作しません。(この辺は、mscorlib.dllがInternalCallしていたり、System.dllがDllImportしていたりすることを思い出してもらえれば、分かるかもしれません。Cランタイム側がサポートしていない可能性、AndroidでP/Invokeできないライブラリを呼び出している可能性があります。)

.NETのAPIはコアmscorlibライブラリから制限を受けます。デスクトップでは1.0, 1.1, 2.0が存在し(バージョン番号はそれぞれ1.0.3300.0, 1.0.5000.0, 2.0.0.0)、そのmscorlibで公開されたAPIをもとに、残りのアセンブリが実装されています。

MonoDroidでは、サーバ/デスクトップアセンブリを使用する代わりに、軽量なSilverlightの基盤を選びました。依存性は小さく、デバイスにより小さなコードを持ち込むことができ、Androidに適合しない数多くの機能(たとえば、ユーザが編集できることが前提の.configファイルをサポートするためにあるSystem.Configurationなど)を削っています。

MonoDroidではSilverlight/Moonlightアプリケーションが動作しますか?

いいえ。MonoDroidは今のところMoonlightやSilverlightユーザーインターフェースの機能が含まれていません。コアライブラリの機能があるだけです。

MonoDroidではXAMLアセットを読み込めますか?

いいえ。MonoDroidは今のところMoonlightやSilverlightユーザーインターフェースの機能が含まれていませんから、XAMLサポートも有効にしていません。(補足すると、System.Xamlライブラリはアルファクオリティで動かせるけど、.xamlファイルに書かれた実際のアセンブリが読み込めないので意味がない)

MonoDroidではWindows Formsアプリケーションをサポートしますか?

いいえ。MonoDroidには現在Windows.Formsの機能は含まれていませんし、そういう計画もないです。

MonoDroidではVisual Basicをサポートしますか?

今のところMonoDroidではVisual Basicをサポートしていません。

将来のMonoDroidのバージョンではVisual Basicをサポートしたいとは思っています。

技術的な側面では、今の状態はこうです: われわれはまずVisual Basicヘルパー ライブラリ(Microsoft.VisualBasic.dllの部分)を、標準のMono 2.0のmscorlib.dllではなくMonoDroidのmscorlib.dllを使ってコンパイルして動作するようにしなければなりません。

そうすれば、MicrosoftVisual Studioを使って、MonoDroidで動作するVBコードをコンパイルできるようになります。しかし、われわれはMono自身のVisual Basicコンパイラをサポートしたいところで、そうなるとそのコンパイラがMonoDroidのmscorlib.dllを使って実行できるようになる必要があります。難しいことではないのですが、実現する時間が必要ですし、リリースプロセスにも統合する必要があります。

現在のところ、これがいつ実現するかは未定です。

MonoDroidではWCFをサポートしますか?

MonoDroidではWCFのサブセットをサポートしますが、それは標準のSystem.Web.Servicesスタック(古い.NET 1.0のSOAP)ほどテストされたものではありません。

WCFのサブセットはSilverlightで公開されているものとほぼ同じです(正確にはちょっと違う。BASIC認証とかできるようにしてあるし)。これは、MonoDroidのWCFスタックは、われわれのオープンソースSilverlight実装であるMoonlightから派生したものであるためです。

WCFはアルファ版相当というのは間違いなので訳文はカット。原文も見直すように伝えてあります。)

もしあなたが期待しているのがシステム間でRPCを使いたいということだけであれば、Googleのprotocol bufferのさまざまな.NETバージョンを使うと良いでしょう: protobuf-net, protobuf-csharp-port (参考: Silverlight Binary Serialization using Protobuf-net

ライセンシング

MonoDroidはいくらしますか?

MonoDroidの価格体系についてはまだ公開していませんが、MonoTouchと同様の価格帯になると想定してください(個人ユーザーが$400、エンタープライズユーザーが$1000)

MonoDroidはどのようにライセンスされますか?

MonoDroidはオープンソースのmonoの上に作られた商用/プロプラエタリなソフトウェアとしての公開となり、開発者ベースのライセンスになります。

プロモーションについては何か企画していませんか?

プロモーションはいくつか考えていますが、まだ特にお知らせしていません。

プレビュー/ベータ版で作ったアプリケーションを公開してもいいですか?

これは今のところ認められていません。

MonoDroidはGo-Liveのようなライセンスでは公開されていません。プレビューは単に、どんなものが発売されるかをプレビューするためのもので、アプリケーションをユーザー向けに一般にデプロイすることは想定していません。

これにはいくつかの理由があります:

  • MonoDroidには既知のバグがたくさんあり、これを公開してもあなたのソフトウェアやMonoDroidが残念なものに見えることでしょう。
  • ガベージコレクションが、現在、無効となっていますので、アプリケーションは長時間動作しません。
  • ランタイムは(アプリケーション間で)共有される予定で、このランタイムが今後数週間で大幅に変化するため、最終版のリリースにいたるまでに、どのアプリケーションも壊れるでしょう。
  • 各種の最適化がまだ行われていません。

現在のランタイムの使用期限が切れると、あなたのアプリケーションも動作しなくなります。