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

AIDL紹介

AIDLとは何ですか?


時々、AプロセスからBプロセスに通信したいことがあります。
その際、AIDLを使用して異なるプロセス間で通信することができます。

例えば:


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

さらに、AIDLは一般的なIPCソリューションです。
別の記事で一般的な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

You might also enjoy