ものがたり(旧)

atsushieno.hatenablog.com に続く

monodroid: Architecture

これは http://monodroid.net/Documentation/Architecture の(現時点での)日本語訳。そろそろ退屈な導入記事はおいといて、面白い資料の翻訳にシフトしていきます。MonoDroidの仕組みについてはよく質問されるし、わたしも正確に把握していない部分もあるので、翻訳する価値がありますね。

= アーキテクチャ =

MonoDroidアプリケーションはMono実行環境上で動作します。この実行環境はDalvik仮想マシンと並列で動作します。どちらの実行環境も、Linuxカーネル上で動作し、その下層にあるシステムに開発者がユーザーコードでアクセス出来るようにAPIを公開しています。MonoとDalvikはどちらもC言語で書かれたランタイムです。

下層のLinuxオペレーティングシステムの機能にアクセスするために、System.*、System.IO.*、System.Net.*その他の.NETのクラスライブラリを使用することができます。

AndroidOSでは、オーディオ、グラフィックス、OpenGL、テレフォニーなどはCベースのアプリケーションでは利用できず、Java.*ネームスペースやAndroid.*ネームスペースにあるDalvikのJava APIを通してのみ公開されており、そのアーキテクチャは概ねこんな感じです:

MonoDroidの開発者は、よく知っている.NET APIで(低レベルアクセスのために)呼び出したり、Dalvikで公開されたJava APIへのブリッジを提供するAndroid.*ネームスペースを使用したりすることで、このオペレーティングシステムの機能にアクセスします。

Android.*クラスがDalvikのクラスとやり取りする方法については、API Designのドキュメントを見て下さい。

Android Callable Wrappers

Android Callable Wrapperは、Androidランタイムがマネージドコードを呼び出す必要がある時にいつでも使用されるJNIブリッジです。

Managed Callable Wrappers

Managed Callable Wrapperは、マネージドコードがAndroidコードを呼び出す必要がある時にいつでも使用されるJNIブリッジです。Android.*および関連するネームスペース全体が、内部ツールによって生成されたManaged Callable Wrapperです。Managed Callable Wrapperは、マネージドコードとAndroidの型の間を変換して、下層にあるAndroidプラットフォームのメソッドをJNIで呼び出す責務を負います。

Activityの開始

activityが立ち上がると、AndroidAndroidManifest.xmlファイルを関連する.apkファイルから読み出して、ロードするJavaのクラスの名前を/manifest/application/activity/@android:name属性から決定します。この型はandriod.app.Activity型を継承しなければならず、いったんこれがロードされたら、Activity.onCreate(Bundle)メソッドが呼び出されます。Activity.onCreateは、概念的には、古典的なMain()エントリポイント メソッドを、別の機構で実現しているものだと言えます。

Android.App.Activityは、マネージドコードにおけるこのactivityの基底クラスであり、Activity.OnCreate(Bundle)メソッドが、activityの開始時に呼び出されます。

これは、ビルドプロセスにおいてmonodroid.exeによって生成されたAndroid Callable Wrapperによって動作します。Javaソースコードが生成され、その中には、マネージドコードでオーバーライドされたメソッドのそれぞれに対応するネイティブメソッド宣言が含まれます。そしてそのJavaの型名が /manifest/application/activity/@android:name 属性の値として AndroidManifest.xml に書き込まれます。

このようにして、AndroidAndroid Callable Wrapper (ACW)をロードして実行します。これはネイティブメソッドを呼び出す前に、MonoDroidランタイムおよび必要なマネージドコードををロードして初期化し、オーバーライドされた Android.OnCreate() メソッドのマネージドコードに制御を渡します。