2013年4月12日金曜日

AIDL(Androidのプロセス間通信のためのインターフェイス定義言語)

 「AIDL」とはAndroidのプロセス間通信のためのインターフェイス定義言語で、Javaのinterfaceを定義する書式に似ている独自言語で記述します。

 拡張子は「.aidl」で、慣習としてインターフェイスには「I」で始まる名前が付けられます。このファイルをEclipseのプロジェクト内に入れておけば、自動的に対応するJavaのソースコードが「gen」ディレクトリに生成されます。

 AIDLのコード例

 以下が今回のサンプルで使用しているAIDLです。

  ICalculatorService.aidl
package com.example.android.service; // 【1】     import com.example.android.service.ICalculatorCallback; // 【2】  import com.example.android.service.CalculatorExpression;     interface ICalculatorService { // 【3】      oneway void registerCallback(ICalculatorCallback callback); // 【4】      oneway void unregisterCallback(ICalculatorCallback callback);      int add(int lhs, int rhs);      void sum(in List values); // 【5】      void rotate(inout int[] array, int num);      int eval(in CalculatorExpression exp);  }     

  ICalculatorCallback.aidl
package com.example.android.service;     oneway interface ICalculatorCallback { // 【6】      void resultSum(int value);  }   

  CalculatorExpression.aidl
package com.example.android.service;     parcelable CalculatorExpression; // 【7】  

 青い部分がAIDL固有のキーワードです。

 【1】のように、Javaと同じパッケージ宣言が必要です。一方で、Javaとは異なり、【2】のように同一パッケージのAIDLも明示的にインポートしなければなりません。【3】のようにインターフェイス名を宣言します。この名前とファイル名は同一でなければなりません。

 【4】の「oneway」というキーワードは、そのメソッドの終了を待つ必要がないことを意味しています。【5】のように、オブジェクトの引数には「in」「out」「inout」のいずれかのキーワードを指定します。プリミティブ型には、この指定は必要ありません。「in」が入力にのみ使用する、「out」は出力にのみ使用する、「inout」は入出力に使用することを意味します。適切に指定することで、プロセス間でのデータ転送量を抑えられます。

 【6】のように、インターフェイスのすべてのメソッドにonewayを指定する代わりに、インターフェイスにonewayを指定することも可能です。

 【7】の「parcelable」キーワードで指定したクラスが「Parcelable」であることを指定します。このクラス名とファイル名は同一でなければなりません。

 AIDLの書き方

 AIDLを一般化すると、次のような形式になります。

package <PackageName>;  [import <FQCN>;]  [parcelable <FQCN>;]     [oneway] interface <InterfaceName> {      [oneway]<ReturnType> <MethodName> ([in|out|inout] <ArgType> <ArgName> ……);  }

 上記の「ReturnType」「ArgType」、戻り値と引数に使用可能な型には制限があります。後ほど一覧にして示します。

 AIDLは、簡潔な定義でプロセス間通信が行え、かつコールバックまで実現可能です。コールバックを介して、サービスとクライアントで相互通信が実現できるわけです。

 AIDLの利点

 もし、AIDL以外でプロセス間通信を行おうとすると、TCP/IPを使用する(非公開クラスの「WindowManagerService」「ViewServer」のように)、UNIXドメインを使用する(「netd」「ndc」のように)、共有メモリを使用する(「Ashmem」「Zygote」のように)、といったローテクな方法に頼らざるを得ません。

 AIDLは定義ファイルだけをクライアントに配布することで、Javaコンパイラで保証される安全で簡単なプロセス間通信が行えます。

0 件のコメント:

コメントを投稿