AndroidをC#に移植したXobotOS
Xamarinが設立されてからそろそろ1年が経とうとしています(ついでにMono for Androidのバージョン1.0が出てから1年と1ヶ月くらいです)。その間にXamarinはエンジニアを揃え、ドキュメントチームを編成し、QAチームを再編成し、オンラインセミナーを行えるような体制を整えてきたわけです。これだけやってまだ1年とか…まあわたしがjoinしたのは8月ですけど。*1
そんなわけで、設立1周年を記念して(?)、Xamarinからでっかい釣り餌、AndroidをC#に移植したリサーチプロジェクトXobotOSがリリースされました。
http://blog.xamarin.com/2012/05/01/android-in-c-sharp/
これは、アプリケーションがDalvik VM (zygoteプロセス)上のAndroidフレームワークの上で動作しているMono for Androidとはまったく違うものです。OSはLinuxで、基本的なアプリケーションのライフサイクルはAndroidと同じだけど、それを動かしているのはDalvikではなくmono VMということになります。Androidの仕組みは、よくこんな図面で説明されますが、
XobotOSは、この図面のAndroid RuntimeやApplication Framework(とそれより上)をC#のコードで換骨奪胎したものと言えるでしょう。
じゃあJavaで書かれたAndroidのフレームワークはどうやって動いているのか?というと、SharpenというJava-to-C#のトランスレータを利用して、AOSPのソースコードの一部をC#に変換したものをビルドして動かしているようです*2。Sharpenは元々はXamarinで作られたものではないのですが、MonoDevelopでgitサポートを統合するにあたってJGitをソースコード変換してNGitをビルドするために改良を加えたもので、Sharpenは、iPadで電子回路を設計しようと思ったことのある人なら一度は見たことがあるんじゃないかと思われるiCircuitの開発でも使われています。今回、XobotOSを開発するにあたって、このSharpenに、さらに今回大幅に改良が加えられたようです。その成果はXobotOSのソースコードの中に含まれています。
https://github.com/xamarin/XobotOS
現在のXobotOSでは、既にAndroidのレイアウトエンジンとコントロールのレンダリングがC#だけで行えているところまで出来ているようです。(画像はgithubのリポジトリから適当に引っ張ってきました)
今回のblog postでは、パフォーマンス比較もいくつか出ていますが、monoがえらく速いです。
ちなみに、じゃあメモリ消費はどうなのか、ですが、3年前にandroidmonoの開発者(CyanogenModの開発者というのが表の顔でしょうか)がdalvikとmonoの比較記事を書いています。
Xamarinは既存のモバイルプラットフォームをターゲットに商売しているので、XobotOSの開発にリソースを投入するようなことは出来ないわけですが、けっこう面白いものを作れるんじゃないか?というのが、今回の発表ということになります。今回の成果の一部は、今後のMono for Androidにも組み込まれていくかもしれません。既にSkiaのC#バインディングなんかはあるようです。
XobotOSのアイディアは、もともと1年前にXamarin設立後初めて行われた社内ミーティングの時に出てきたものでした*3。1年前というと、まだHoneycombのソースコードがずっと非公開で、2.3でようやくNativeActivityが公開されたものの、そのアプリケーションライフサイクルがJavaから抜け出せていなくて残念なものになっていた、という状態だったように思います*4。それを見て、もうJavaベースのフレームワークをC#に置き換えちゃえばいいんじゃね?みたいな話をしていたのでした。数日後にMonospace conferenceが開かれましたが、そこでも「mono phoneはいつ出るんだ?w」みたいな質問がシメのスピーチの時に出ていたのを思い出します。
…というわけで、なかなか面白い発表だったと思いますがどうでしょう? これだけやってまだ1年なので、次の1年はどうなるのか、まだまだ楽しみです。