KC Blog

「[アプリ開発] AIDLを使ってAndroidアプリのクロスプロセス開発を始めましょう!」

7 min read
AndroidDev#Android

AIDL紹介

AIDLとは何ですか?

時々、AプロセスからBプロセスに通信したいことがあります。

その際、AIDLを使用して異なるプロセス間で通信することができます。

例えば:

  1. 二つのアプリ間の通信に使用できます。
  2. アプリとネイティブカーネル層との通信に使用できます (ただし、自分でAOSPをビルドし、作成したアプリケーションを低層に組み込む必要があります)。
  3. またはアプリとサービスの通信などに使用できます。

さらに、AIDLは一般的なIPCソリューションです。

別の記事で一般的なIPCソリューションについて整理していますので、参考にしてください。

IPC 跨プロセスソリューションの共有


Cover

[問題解決シリーズ] Android IPC 跨プロセスソリューションの共有

AIDL実装

ステップ1:まずAIDLインターフェースを定義する
  • このステップでは、ノートブックに自由に書くことができます。
  • またはIDEを使って書くこともできます(ここではAndroid Studioを使用しています)。
  • 文字が入力できる場所ならどこでも書くことができます。

次に、AIDLで公開するインターフェースを定義します:

  • 例えば、全ての更新リストを取得する機能が欲しい場合、getUpdateListのようなインターフェースを作成します。

  • ステータスを取得したい場合はgetStatusのインターフェースを作成します。

  • このようにして次々と定義します。

    1.png

  • 最後に、拡張子を.aidlとして保存します。

11.png

ステップ2:サービスを実装する
  • 上記のAIDLインターフェースを完成させた後、一度ビルドする必要があります。

CLIを使用することもできます。./gradle buildでビルドするか、またはAndroid StudioのBuild > Rebuild Projectを使ってビルドします。

12.png

  • ビルドが完了すると、同じファイル名の.javaファイルが生成されます。

13.png

  • 通常、AndroidアプリでAIDLインターフェースを呼び出す際は、Serviceを使用します。そのため、まずServiceを継承し、必要なライフサイクルメソッドをオーバーライドします。

例は以下の通りです:

  • 同じサービスに、先ほどビルドしたAIDLインスタンスを追加します:
💡 Tips:AIDL インターフェースと Service パッケージパスは同じでなければコンパイルできません

以下は3つの図です:

3.png

4.png

5.png

ステップ3:Manifest.xml に Service を追加

ステップ2 で作成した Service を AndroidManifest.xml に追加し、action を追加します

ここでの action は後で ステップ5 で ServiceConnection でバインドするための action に対応しています

action android:name="elegant.access.service.IRSSmartService"

ステップ4:Intent bind service を実装
  • ここからは AIDL インターフェース + 実装を持つ AIDL インスタンス化されたサービスを他のプロセスのアプリケーションや他の層に提供できます

Android 内であれば、必要な場所で Intent を使用して起動できます

詳細は ステップ5~7 を参照してください

(オプション) ステップ5:その他のユースケース
* アプリケーション層で AIDL Service を使用する場合は、以下のコードを参照してください

Intent を使用してバインドする AIDL サービス

その後、すでに実装されているメソッドを直接操作できます

例:

eleAcesAPI.getUpdateList();
  • もし アプリケーション層以外 で使用する場合

ここで 経験を共有 します:以前、プロジェクトでアプリケーション層で AIDL インターフェースを定義する必要がありましたが、実際の使用はフレームワークカーネル層に配置する必要がありました(たまたまそのプロジェクトは自分で OTA を行っていました)

したがって、もし同様の状況であれば、AIDL インターフェースを開くだけで十分です

これにより、ステップ3 まで完了します

その後、実装する層が AIDL をサポートしているかどうかを確認してください

例えば:私が遭遇したプロジェクトは自分で OTA を行っていました

カスタムバインダーを定義できるため、C# を使用して AIDL インターフェースを持つサービスを作成しました

その後、アプリケーション層でバインドするだけです

ここではリフレクションを使用して

カーネルに作成されたサービスをバインドします

バインドの例:

⚠️ 注意:これは下層を開発する必要がある場合にのみ使用してください。アプリで AIDL を実装する場合は前述のものを使用してください
⚠️ 注意2:Android 公式は Android 9 以降で新しいリフレクションポリシーを更新しています。その時点での機種 OTA の対象バージョンが 5~8 だったため、これがまだ使用可能かどうかは不明です。自分でテストしてください
(オプション) ステップ6:その他のユースケース - AIDL サポートされる型が限られています
  • プロジェクトに特定の戻り値が必要な場合があるため、例えばカレンダーなど

しかし、AIDL は元々このタイプをサポートしていないため、抽象層を追加して実装するだけで済みます

9.png

(オプション) ステップ7:その他のユースケース - AIDL を Jar ファイルにパッケージ化
  • 当時、groovy 構文を使用して直接 jar ファイルをビルドし、他のプロセスで使用できるようにしました

次のように行うことができます:

10.png