【备忘】Binder简单总结

Binder结构

       当我们使用AIDL进行跨进程调用时,我们需要在两端各创建AIDL文件,此时系统会帮我们在generated/source/aidl/debug/包名/下创建两个一样的Binder文件,这个文件分为三级结构,即描述远程调用方法的接口-客户端转换Binder对象以及服务端处理请求的Stub类-客户端填入参数发起远程调用的Proxy类。

       最上层是一个我们在AIDL中声明了的接口(描述我们需要调用的方法的接口),此接口继承IInterface(注意是继承)接口,含有三部分内容,第一部分是Stub类,第二部分是标识客户端想调用的不同方法的整型id,第三部分是目标调用方法的签名。

       Stub内部类继承Binder类,实现了上面的接口(即父接口),含有两个主要方法,一个是asInterface方法,此方法用于转换服务端的AIDL接口对象,若为同进程调用,返回服务端Stub对象本身,否则返回系统封装后持有服务端Binder引用的Proxy对象;另一个是onTransact方法,这个方法被分配处理远程请求,通过code分辨所调用方法,然后从data中取出参数执行目标方法,写入返回值。若返回false则远程调用请求失败。

       Proxy类同样实现了上面的一级接口,此类含有两部分,第一部分为asBinder方法,返回当前的远程Binder对象引用,第二部分为AIDL中定义的远程方法的同名方法(或不止一个),作用为创建远程方法所需要的进出参数写入data,然后调用transact方法发起RPC远程过程调用请求,然后挂起,当RPC过程返回后取出并返回处理结果。

调用过程

       经由以上,Binder调用的实际过程为服务端通过Binder向ServiceManager注册,Client向ServiceManager查找目标服务,发出调用请求,Binder驱动返回一个远程引用(远程调用时),客户端调用同名方法并挂起,Binder驱动通知服务端调用相应方法,Binder驱动返回结果。Binder本身也是种服务,占用了Binder驱动中的0号引用。

你可能感兴趣的:(Android,binder,andorid)