AIDL概述,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 開始))之間使用時,必須使用稱為穩定 AIDL 的版本控制系統。

例子

下面是一個 AIDL 介面範例:

    package my.package;

    import my.package.Baz; // defined elsewhere

    interface IFoo {
        void doFoo(Baz baz);
    }

伺服器進程註冊一個介面並提供對其的調用,而客戶端進程則調用這些介面。在許多情況下,進程既充當客戶端又充當伺服器,因為它可能引用多個介面。有關 AIDL 語言的更多詳細信息,請參閱AIDL 語言。有關可用於使用這些介面的各種運行時的更多詳細信息,請參閱AIDL 後端。這些類型聲明與給定語言中的類別聲明完全相同,但它們跨進程工作。

怎麼運作的

AIDL使用binder核心驅動程式進行呼叫。當您進行呼叫時,方法標識符和所有物件都會打包到緩衝區中,並複製到遠端進程,其中綁定器執行緒等待讀取資料。一旦綁定器執行緒接收到事務的數據,該執行緒就會在本機程序中尋找本機存根對象,並且此類解包資料並呼叫本機介面對象。此本機介面物件是伺服器程序建立和註冊的物件。當在同一個進程、同一個後端進行調用時,不存在代理對象,因此直接調用,無需任何打包或解包。

與設備上的服務交互

Android 附帶了一些命令來允許與裝置上的服務進行互動。嘗試:

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