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

関連記事

タグとカテゴリに基づく関連コンテンツ

6 min read

Androidの永続ストレージをマスターする:KotlinとRoomデータベース実践講座

この実践講座では、AndroidアプリケーションでKotlinとRoomを使用して永続ストレージを実現する方法を詳しく探ります。初心者から経験豊富な開発者まで、この講座は実用的な知識とテクニックを提供し、Androidアプリケーションの開発をより効率的に行えるようにします。KotlinとRoomデータベースの強力な機能を一緒に探求し、次のAndroidプロジェクトに完璧に組み込みましょう!

📁 AndroidDev
#Android#Kotlin
6 min read

Android Kotlin:クラシックなスネークゲームの再現、1日で作って遊べる!

このチュートリアルでは、クラシックなスネークゲームを一歩一歩作成し、ゲーム開発の楽しさを存分に体験していただきます!初心者から経験豊富な開発者まで、この実践的なチュートリアルを通じてKotlin言語とゲーム開発の理解を深めることができます。一緒にこの老若男女に愛されるゲームを再現し、自分だけのクラシックな思い出を作りましょう!

📁 AndroidDev
#Android#Kotlin
8 min read

流暢なAndroidアプリの遷移体験を実現!KotlinでNavigationを使って、アプリの遷移問題を一気に解決!

「流暢なAndroidアプリの遷移体験を実現!」Jetpack Navigation with Kotlinを使用して、アプリの遷移問題を解決します。Jetpack Navigation with Kotlinの強力な機能を活用することで、アプリ内の各画面や操作フローを簡単に管理し、よりスムーズで使いやすいユーザー体験を提供します。

📁 AndroidDev
#Android#Kotlin+1