AIDL の概要

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

AIDL は、Android の任意のプロセス間 (プラットフォーム コンポーネント間またはアプリ間) で使用できます。ただし、アプリの API として使用されることはありません。たとえば、AIDL はプラットフォームに SDK API を実装するために使用できますが、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