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 内核驱动程序进行调用。当您进行调用时,方法标识符和所有对象都打包到缓冲区中,并复制到远程进程,binder 线程在该进程中等待读取数据。一旦 binder 线程接收到事务的数据,该线程就会在本地进程中查找本机桩对象,并且此类会解包数据并在本地接口对象上进行调用。此本地接口对象是服务器进程创建和注册的对象。当调用在同一进程和同一后端中进行时,不存在代理对象,因此调用是直接的,没有任何打包或解包。

与设备上的服务互动

Android 附带了一些命令,允许与设备上的服务进行互动。请尝试

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