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