AIDL 概述

Android 接口定義語言 (AIDL) 是一種讓用戶可以抽像出 IPC 的工具。給定的接口(在指定.aidl文件),各種構建系統使用aidl二進制構建C ++或Java的綁定,使得該接口可以跨進程使用,無論運行時或位元那裡。

AIDL 可用於 Android 中的任何進程之間:平台組件之間或應用程序之間。但是,它從未用作應用程序的 API。例如,AIDL 可用於在平台中實現 SDK API,但 SDK API 表面從不直接包含 AIDL API。有關如何直接在應用程序之間使用AIDL文檔,請參見相應的Android開發文檔。當AIDL被平台組件被分別更新,諸如頂點之間使用或HALS(Android中10開始)(Android中11開始),被稱為版本系統穩定AIDL必須使用。

例子

這是一個示例 AIDL 接口:

    package my.package;

    import my.package.Baz; // defined elsewhere

    interface IFoo {
        void doFoo(Baz baz); // synchronous method
        oneway void doFoo(int a); // async method
    }

Android 10 及更高版本支持 Parcelable 聲明。例如:

    package my.package;

    import my.package.Boo;

    parcelable Baz {
        @utf8InCpp String name = "baz";
        Boo boo;
    }

Android 11 及更高版本支持枚舉聲明。例如:

    package my.package;

    enum Boo {
        A = 1 * 4,
        B = 3,
    }

Android 12 及更高版本支持聯合聲明。例如:

    package my.package;

    import my.package.FooSettings;
    import my.package.BarSettings;

    union Settings {
        FooSettings fooSettings;
        BarSettings barSettings;
        @utf8InCpp String str;
        int number;
    }

Android T(AOSP 實驗性)及更高版本支持嵌套類型聲明。例如:

    package my.package;

    import my.package.Baz;

    interface IFoo {
        void doFoo(Baz.Nested nested);  // defined my/package/Baz.aidl
        void doBar(Bar bar);            // defined below

        parcelable Bar { ... }          // union/enum types can be nested, while
                                        // an interface can't.
    }

服務器進程寄存器的接口,並提供對它的調用,以及客戶端進程向這些接口的調用。在許多情況下,一個進程既充當客戶端又充當服務器,因為它可能引用多個接口。有關可使用這些接口的各種運行時的詳細信息,請參閱AIDL後端。這些類型聲明與給定語言中的類聲明完全一樣,但它們跨進程工作。

這個怎麼運作

AIDL 使用 binder 內核驅動程序進行調用。當您進行調用時,方法標識符和所有對像都被打包到一個緩衝區中並複製到一個遠程進程,在該進程中綁定線程等待讀取數據。一旦綁定線程接收到事務的數據,該線程就會在本地進程中查找本機存根對象,此類將數據解包並調用本地接口對象。這個本地接口對像是服務器進程創建和註冊的對象。當在同一個進程和同一個後端進行調用時,不存在代理對象,因此調用是直接的,沒有任何打包或解包。

與設備上的服務交互

Android 附帶了一些命令來允許與設備上的服務進行交互。嘗試:

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