コンテンツへスキップ
ものがたり
戻る

android aidlツールの覚書

ひさびさにAndroid小ネタを書こう。

Androidで他のアプリケーションとやり取りするには、AIDLとServiceを使う。http://developer.android.com/guide/developing/tools/aidl.html

AIDLで規定されたインターフェースに従ってメッセージを送信すると、その規定に従ったメッセージが返ってくる、というRPCの一類型だ(一方通行の場合もある)。.NETで言うところのservice contractみたいなものだ。

メッセージはParcelというオブジェクトで表される。SOAPは封筒(Envelope)だがこっちは小包だということだろうか。

service contractで使用できる型が限られているように、Androidサービスの通信で利用できる型も限られている。複雑な型にはParcelableというインターフェースを使う。.NETのISerializableみたいなものと言えばよいだろうか。

仕様上許される型は以下のものに限定されている:

実際にaidlのソースを眺めると、以下のTypeが定義されている。ただしこれはASTとして生成されるツリーの中で参照されているのみで生成されないような型も含まれている。

われわれ開発者がAIDLのファイル(拡張子.aidl)で記述することになるのは、parcelableな型とinterfaceの2種類だ。

このうち、parcelableについては、単に「この型はParcelableですよ」と宣言するためのものでしかない。aidlツールは特にライブラリを参照せずに型名から型の種類を解決しなければならず、名前だけでは特定の型をParcelableとして処理することができないので、個別にparcelable FooBar; として宣言してやる必要がある。正直こんなのは各ファイルでimport宣言する時についでに書けるようにしておけば(“import android.os.Bundle parcelable;“とか)、個別に宣言する必要などないのだから、AIDLがいかにやっつけ言語であるかが分かるというものだ。

一方、インターフェースを宣言する*.aidlファイルについては、aidlツールはスタブ型などを生成する。生成されるのはサービスのスタブクラス (Stub)、そしてそのクライアントとして使えるProxyだ。ProxyはIBinderを実装したremoteを経由して当該インターフェースのメソッドをTransact()で呼び出しているだけだが、スタブクラスのコードを一部使いまわすのでスタブクラスの中に入っている。

サービスのStubクラスは、当該インターフェースを実装するものとして生成されるので、サービスを公開しようとする開発者が、自分でインターフェースメソッドを実装しなければならない。Stubはabstractとして宣言されるので、いずれにしろこの生成コードを直接いじるのではなく、自分のクラスで実装することになろう。

stubおよびproxyでは、(サポートされている範囲内で)任意のオブジェクトから、Parcelを生成してやり取りするロジックを、メソッドの引数型および戻り値型に応じて生成している。

最後におまけになるが、Parcelableインターフェースにはやや癖があるので、少し補足しておきたい。というかJavaはインターフェースがAPIを十分に規定しない傾向があると思うので、どうにかしたほうがいいと思う。Serializableインターフェースを実装するのに、宣言されていないreadObject() / writeObject()が必要だったりとか、何なんだろう。

とりあえずこんなところで。


この記事を共有:

前の記事
.NET 4.5 betaをインストールするとmonodevelopでMono for Android, PSSuiteのプロジェクトがビルドしなくなる(らしい)
次の記事
AndroidをC#に移植したXobotOS