「[アプリ開発] AIDLを使ってAndroidアプリのクロスプロセス開発を始めましょう!」
AIDL紹介
時々、AプロセスからBプロセスに通信したいことがあります。
その際、AIDLを使用して異なるプロセス間で通信することができます。
- 二つのアプリ間の通信に使用できます。
- アプリとネイティブカーネル層との通信に使用できます (ただし、自分でAOSPをビルドし、作成したアプリケーションを低層に組み込む必要があります)。
- またはアプリとサービスの通信などに使用できます。
さらに、AIDLは一般的なIPCソリューションです。
別の記事で一般的なIPCソリューションについて整理していますので、参考にしてください。
AIDL実装
-
このステップでは、ノートブックに自由に書くことができます。
またはIDEを使って書くこともできます(ここではAndroid Studioを使用しています)。
文字が入力できる場所ならどこでも書くことができます。
次に、AIDLで公開するインターフェースを定義します。
例えば、全ての更新リストを取得する機能が欲しい場合、
getUpdateList
のようなインターフェースを作成します。
ステータスを取得したい場合はgetStatus
のインターフェースを作成します。
このようにして次々と定義します。
-
最後に、拡張子を
.aidl
として保存します。
-
上記のAIDLインターフェースを完成させた後、
一度ビルドする必要があります。
CLIを使用することもできます。
./gradle build
でビルドするか、
またはAndroid StudioのBuild > Rebuild Project
を使ってビルドします。
-
ビルドが完了すると、同じファイル名の.javaファイルが生成されます。
-
通常、AndroidアプリでAIDLインターフェースを呼び出す際は、Serviceを使用します。
そのため、まずServiceを継承し、必要なライフサイクルメソッドをオーバーライドします。
例は以下の通りです:
-
同じサービスに、先ほどビルドしたAIDLインスタンスを追加します:
以下は3つの図です:
ステップ2
で作成した Service を AndroidManifest.xml に追加し、action を追加します
ここでの action は後で ステップ5
で ServiceConnection でバインドするための action に対応しています
action android:name="elegant.access.service.IRSSmartService"
- ここからは AIDL インターフェース + 実装を持つ AIDL インスタンス化されたサービスを他のプロセスのアプリケーションや他の層に提供できます
Android 内であれば、必要な場所で Intent を使用して起動できます
詳細はステップ5~7
を参照してください
- アプリケーション層で AIDL Service を使用する場合は、以下のコードを参照してください
Intent を使用してバインドする AIDL サービス
その後、すでに実装されているメソッドを直接操作できます
例:
eleAcesAPI.getUpdateList();
- もし
アプリケーション層以外
で使用する場合
ここで経験を共有
します:以前、プロジェクトでアプリケーション層で AIDL インターフェースを定義する必要がありましたが、実際の使用はフレームワークカーネル層に配置する必要がありました(たまたまそのプロジェクトは自分で OTA を行っていました)
したがって、もし同様の状況であれば、AIDL インターフェースを開くだけで十分です
これにより、ステップ3
まで完了します
その後、実装する層が AIDL をサポートしているかどうかを確認してください
例えば:私が遭遇したプロジェクトは自分で OTA を行っていました
カスタムバインダーを定義できるため、C# を使用して AIDL インターフェースを持つサービスを作成しました
その後、アプリケーション層でバインドするだけです
ここではリフレクションを使用して
カーネルに作成されたサービスをバインドします
バインドの例:
- プロジェクトに特定の戻り値が必要な場合があるため、例えばカレンダーなど
しかし、AIDL は元々このタイプをサポートしていないため、抽象層を追加して実装するだけで済みます
- 当時、groovy 構文を使用して直接 jar ファイルをビルドし、他のプロセスで使用できるようにしました
次のように行うことができます: