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