AIDLの概要

Android インターフェイス定義言語 (AIDL) は、ユーザーが IPC を抽象化できるようにするツールです。インターフェース ( .aidlファイルで指定) を指定すると、さまざまなビルド システムがaidlバイナリを使用して C++ または Java バインディングを構築し、ランタイムやビット数に関係なく、このインターフェースをプロセス間で使用できるようにします。

AIDL は Android の任意のプロセス間 (プラットフォーム コンポーネント間またはアプリ間) で使用できます。ただし、アプリの API として使用されることはありません。たとえば、プラットフォームに SDK API を実装するために AIDL を使用することはできますが、SDK API サーフェスに AIDL API が直接含まれることはありません。アプリ間で AIDL を直接使用する方法に関するドキュメントについては、対応するAndroid 開発者ドキュメントを参照してください。 APEX(Android 10 以降)や HAL(Android 11 以降)など、個別に更新されるプラットフォーム コンポーネント間で AIDL を使用する場合は、 Stable AIDL と呼ばれるバージョン管理システムを使用する必要があります。

AIDL インターフェースの例を次に示します。

    package my.package;

    import my.package.Baz; // defined elsewhere

    interface IFoo {
        void doFoo(Baz baz);
    }

サーバープロセスはインターフェイスを登録して呼び出しを処理し、クライアントプロセスはそれらのインターフェイスを呼び出します。多くの場合、プロセスは複数のインターフェースを参照する可能性があるため、クライアントとサーバーの両方として機能します。 AIDL 言語の詳細については、AIDL言語を参照してください。これらのインターフェースを使用できるさまざまなランタイムの詳細については、 AIDL バックエンドを参照してください。これらの型宣言は、特定の言語のクラス宣言とまったく同じですが、プロセス間で機能します。

使い方

AIDL はバインダー カーネル ドライバーを使用して呼び出しを行います。呼び出しを行うと、メソッド識別子とすべてのオブジェクトがバッファーにパックされ、バインダー スレッドがデータの読み取りを待機するリモート プロセスにコピーされます。バインダー スレッドがトランザクションのデータを受信すると、スレッドはローカル プロセスでネイティブ スタブ オブジェクトを検索し、このクラスはデータをアンパックして、ローカル インターフェイス オブジェクトを呼び出します。このローカル インターフェイス オブジェクトは、サーバー プロセスが作成して登録するオブジェクトです。呼び出しが同じプロセスと同じバックエンドで行われる場合、プロキシ オブジェクトは存在しないため、呼び出しはパックやアンパックなしで直接行われます。

デバイス上のサービスとの対話

Android には、デバイス上のサービスと対話できるようにするためのコマンドがいくつか用意されています。試す:

    adb shell dumpsys --help # listing and dumping services
    adb shell service --help # sending commands to services for testing