AIDL(Android 接口定义语言) 是 Android 提供的一种进程间通信 (IPC) 机制。我们可以利用它定义客户端与服务使用进程间通信 (IPC) 进行相互通信时都认可的编程接口。在 Android 上,一个进程通常无法访问另一个进程的内存。 尽管如此,进程需要将其对象分解成操作系统能够识别的原语,并将对象编组成跨越边界的对象。编写执行这一编组操作的代码是一项繁琐的工作,因此 Android 会使用 AIDL 来处理。通过这种机制,我们只需要写好 aidl 接口文件,编译时系统会帮我们生成 Binder 接口。这里主要应用于framework层编译和软硬件结合上面
一 AIDL简单使用
1 在service和client创建相同的文件aidl文件,路径也需要相同 例如 IBookManager.aidl
2 通过makeproject系统编译 在gen文件下会生成相应的java文件 生成IBookManager.java
3 服务端注册service 在service中 初始化 aidl类的stub内部类 IBookManager.Stub 并通过onBind方法返回
4 客户端通过bindservice中serviceconnection的方法onserviceconnected方法中的IBinder参数,通过
IBookManager iBook = IBookManager.Stub.asInterface(service);得到代理类 可以进行跨进程间操作
二 注意事项
1 aidl文件中传输非基本类型需要将类通过parcelable实现序列化并且建立相应的aidl文件还需要在使用文件中手动import
2 再穿传入非基本类型时前面需要添加in out inout等关键字 关键字作用是是否对参数进行传递并修改赋值
3 aidl文件只支持方法不支持静态常量 也是因为序列化传参问题
4 通信是同步操作注意不要在主线程操作 防止有演示操作
5 客户端不能抓取服务端部分异常
三 基本原理
1 client 通过binderservice得到BinderProxy 将他作为参数得到IBookManager.Stub.proxy对象 这个类主要是对BinderProxy进行包装将方法参数经过处理可以跨进程通讯。
2 client得到代理类BinderProxy传值通过tansact方法将序列化的参数通过native方法传入内存binder驱动找到目标引用进而调用服务端的 transact方法 通过onTransact方法验证一些是否是目标类并进行相应方法调用
3 服务端的引用会在初始化时通过native方法 binder驱动得到句柄
四 额外了解
1 客户端得到的都是BInderProxy类 这个类不会被继承 在客户端中IBookManager.Stub.asInterface(service)只要IBinder不为空就不会报错 调用方法时才报错 报错原因是因为写入的DESCRIPTOR 不同
2 同样自己也可以编写java代码来替代不用系统自动生成的 通过方法onTransact 来验证是否正确 客户端可以不用写相应的代码
3 系统生成的文件主要作用就是将方法code和参数序列化后分别放入 reply和data中 回收并通过哦transact传值