AIDL 總覽

Android 介面定義語言 (AIDL) 這項工具可讓使用者排除處理序間通訊 (IPC)。在 .aidl 檔案中指定的介面時,各種建構系統會使用 aidl 二進位檔來建構 C++ 或 Java 繫結,因此無論執行階段或位元性為何,這個介面都能用於不同程序。

AIDL 可用於 Android 的任何程序之間,例如在平台元件之間或應用程式之間。不過從來不會做為應用程式的 API。舉例來說,平台中可透過 AIDL 實作 SDK API,但 SDK API 介面一律不含 AIDL API。如要瞭解如何直接在應用程式之間使用 AIDL,請參閱對應的 Android 開發人員說明文件。如要在個別更新的平台元件之間使用 AIDL,例如 APEX (Android 10 以上版本) 或 HAL (自 Android 11 起),就必須使用稱為「Stable AIDL」的版本管理系統。

範例

以下是 AIDL 介面範例:

    package my.package;

    import my.package.Baz; // defined elsewhere

    interface IFoo {
        void doFoo(Baz baz);
    }

「伺服器」程序會註冊介面並對其提供呼叫,而「用戶端」程序會呼叫這些介面。在許多情況下,由於程序可能參照多個介面,因此程序可同時做為用戶端和伺服器。如要進一步瞭解 AIDL 語言,請參閱 AIDL 語言。如要進一步瞭解您可以使用這些介面的各種執行階段,請參閱 AIDL 後端。這些類型宣告就像指定語言的類別宣告,但可跨程序運作。

運作方式

AIDL 會使用繫結器核心驅動程式發出呼叫。發出呼叫時,方法 ID 和所有物件都會封裝至緩衝區中,並複製到遠端程序,繫結器執行緒會等待讀取資料。繫結器執行緒接收交易資料後,執行緒會在本機程序中查詢原生虛設常式物件,而此類別會解壓縮資料,並對本機介面物件發出呼叫。這個本機介面物件是伺服器程序建立及註冊的伺服器。如果在相同程序和相同的後端發出呼叫,就不會有 Proxy 物件,因此呼叫屬於直接呼叫,不需要任何封裝或解壓縮。

與裝置上的服務互動

Android 隨附一些指令,以便與裝置上的服務互動。請嘗試:

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