ものがたり(旧)

atsushieno.hatenablog.com に続く

MonoDroid beta1 is out

http://monodroid.net/

1週間ほど前に、MonoDroidのベータ版がテストユーザー向けに公開されたので、それについて書いておこうと思う。

今回のベータテストプログラムは、昨年のMonoTouchとほぼ同じ流れで公開されている。これまでサインアップを受け付けていたテストユーザーを、人数を限定して公開している。一応秋頃に商用の正式版が出る予定なので、そうなるとユーザーが誰でも(有償で)入手できるようになるだろう。

MLやIRCに参加しているのを見た感じ、現時点で参加しているテスターの面々は、MonoTouchユーザーとけっこうかぶっているみたいだ。androidmonoの開発者も参加している。うちのチームにはそれなりにiPhoneを卒業してAndroidに移行したわたしのようなメンバーもけっこういるし、両方使っているのもいる。ちなみに、開発チームは、実はMonoTouchとそれなりにかぶっている(MonoTouchでやることはもうそんなに多くない)し、MonoDroidにのみ参加しているメンバーもけっこういる。多分Androidに特別に詳しかったメンバーはひとりもいない。

MonoDroidの基本的な仕組みは、MonoTouchとさほど変わらない。

開発ツールとしては、現在公開されているbeta1は、(なんと)VS 2010のアドイン版しか存在しない。MonoDevelop addin版より先にVS addinが出来てしまったかたちだ。アドインなのでVS 2010 Expressでは動作しない(VS 2010 Shellでも足りない)。最初のbeta1のVS addinでは、クラスライブラリの追加すら出来なかったが、現在のbeta1(ややこしいな)ではクラスライブラリを含む若干のテンプレートが追加されている。

MonoDroidアプリケーションは、soft debuggerを使って、VSからAndroidエミュレータ上で実行しているMonoDroidアプリをデバッグできるようにもなっている(これはMonoTools for Visual Studioと同じ、以前からある仕組みなのだけど、初めて見た人は驚くかもしれない)。もちろん同様のことがMonoDevelop経由でも出来るだろう。

MonoDroidで使えるコアAPIは、MonoTouchと同様、SilverlightのCoreCLRが原点になっている。実際にはMonoTouchで拡大された分のライブラリが含まれている。さらに、MonoTouchみたいにAppleがアホくさい制約を強要することも無いので、System.Reflection.Emitのような動的コード生成が可能だ。これはつまり、DLRが、そしてIronPythonIronRubyが使えるかもしれない、ということでもある(まだ誰も動かしていないと思う)。これは、MonoTouchに比べたら大きな可能性を広げていると言える。ただし、MonoDroidで行われているJavaオブジェクトの呼び出し(Android Callable Wrapper; 後述)は、コンパイル時に解決されなければならず、その関係で、フルにDLRのような動的コード生成が実現できない。

また、AndroidではOpenGL/OpenALが使えるので、MonoDroidにもOpenTKが提供されている。OpenTKを使って書かれたアプリケーションなら、MonoDroidへの移植も難しくないかもしれない。訂正: OpenGLは含まれているがOpenALAndroid本体には含まれていなかった。

MonoDroidアプリケーションは.apkのかたちでパッケージされ、VSアドインがAndroid SDKのadbを使って転送する。アプリケーションの.apkパッケージには、monoランタイムと各種コアライブラリがcecil linker / tunerの仕組みを使ってまとめられたものが含まれている。手元にある1000行以下のアプリケーションで3MB程度ある。訂正: これにはどうやらランタイムとコアライブラリは含まれていない。現状ではランタイムとコアライブラリは↓のデバッグ用ランタイムと一体となっていて、linking/tuningは行わずにアセンブリをロードすることにしているみたい。結局MonoTouchとはだいぶ違う実装になったようだ。

また、VSデバッグ環境にはVSデバッグ用ランタイムが共通パッケージとしてインストールされる(MonoRuntimeService-debug.apk)。これはランタイムの共通ライブラリとは別物、のはず。追記: デバッグ用機能が含まれないランタイムが別途載ることになると予測。

MonoDroidで使えるAndroid APIは、基本的にJavaAPIのラッパーのようなものだ。Android Callable Wrapperと呼ばれている(その役割はCOM Callable Wrapperから連想できると思う)。内部的にはJNIを使っている(はず)。Android APIがpublic APIで表に出しているJavaAPIは、MonoDroidでもJava.Lang.*のようなnamespaceから公開されている(J#みたいだ)。もちろん、大半のgetXXX() / setXXX()はプロパティに置き換わっているし、java.lang.Stringなんかを使う必要は無い。

APIhttp://docs.monodroid.net/ で公開されているので、本家のjavadocにアレルギーがある人なんかも、ここを見てみるといいんじゃないかと思う。基本的には本家のドキュメントをインポートしているはず。ちなみに、Androidには公式APIを定義したXMLファイルが、リリースバージョン別に存在していて、Mono.Android.dllのAPIはこれをもとに作られている。なので、Java APIに非公式なものがあっても、それは存在していない(はず)。

いろいろ書いているうちに本家のドキュメントが追加されたりして、不意打ちをくらったような気になってきたので、とりあえずざっとしたところで今日はここまでにしておこうと思う。気が向いたら本家のドキュメントを訳してみるかも。未定。

追記: MonoDroidをいじるためにAndroidバイスを買ったよ!なんて人たちもいたので念のため書いておくけど、MonoDroidはAndroid 2.1以降のみ対応ということになっているので、巷に数多くあるAndroid 1.6のデバイスを買ってきても使えないので注意。中華padの類は2.1はようやく出てきたばかりで、日本でもHTC DesireとePadくらいしか無いのでは無かろうか。

追記2: いろいろ細々と(あんまし重要でないことを)書き加えてみた。