1、什么是Binder?
直观来说,Binder是Android中的一个类,它实现了IBinder接口。从IPC角度来说,Binder是Android中的 一种跨进程通信方式,Binder还可以理解为一种虚拟的物理设备,它的设备驱动是/dev/binder,该通信方式在Linux中没有;从Android Framework角度来说,Binder是ServiceManager连接各种Manager(ActivityManager、WindowManager,等等)和相应ManagerService的桥梁;从Android应用层来说,Binder是客户端和服务端进行通信的媒。
2、Binder的工作机制
Binder是基于Client-Server的通信模式,除了Client-Server端,还有两个角色一起完成进程间通信的功能。
Binder通信的四个角色:
1)Client进程:使用服务的进程
2)Server进程:提供服务的进程
3)ServiceManager进程:ServiceManager将字符形式的Binder转化成Client中对该Binder的引用,使得Client能够通过Binder名字获得对Server中Binder实体的引用
4)Binder驱动:驱动负责进程之间Binder通信的建立,Binder在进程之间的传递,Binder引用计数的管理,数据包在进程之间的传递与交互等一系列底层支持。
Binder跨进程传输并不是真的把一个对象传输到另外一个进程;传输过程好像是Binder跨进程穿越的时候,它在一个进程留下了一个真身,在另外 一个进程幻化出一个影子;client进程的操纵其实是对于影子的操作,影子利用Binder驱动最终让真身去操作。
3、Binder的实际操作
Binder主要用在Service中,包括AIDL和Messenger
Binder的生成有两种方式:
1)新建一个AIDL实例,SDK会自动为我们生产AIDL所对应的Binder类;
4、Binder内部的几个方法
所有可以在Binder中传输的接口都需要继承IInterface接口,这个接口的核心实现就是它的内部类Stub和Stub的内部代理类Proxy。
当客户端和服务端都位于同一个进程时,方法调用不会走跨进程的transact过程,而当二者位于不同进程时,方法调用需要走transact过程,这个逻辑由Stub的内部代理类Proxy完成。
列举一下接口中几个重要的方法
asBinder
此方法用于返回当前的Binder对象
onTransact
这个方法运行在服务端中的Binder线程池中,当客户端发起跨进程请求时,远程请求会通过系统底层封装后交由此方法来处理,该方法的原型是
public Boolean onTransact(int code,android.os.Parcel data,android.os.Parcel reply,int flags)。服务端通过code可以确定客户端所请求的目标方法是什么,接着从data中取出目标方法所需的参数,然后执行目标方法。当目标方法执行完毕后,就向reply中写入返回值,onTransact方法的执行过程就是这样的。如果返回false,则请求失败。
Proxy
这个代理类中的方法运行在客户端,当客户端远程调用此方法时,它的内部实现是这样的:首先创建该方法的输入型Parcel对象_data,输出型Parcel对象_reply和返回值对象List;然后把该方法的参数信息写入_data中,接着调用transact方法来发起RPC请求,同时当前线程挂起;然后服务端的onTransact方法会被调用,直到RPC过程返回后,当前线程继续执行,并从_reply中取出RPC返回结果。