1:什么是Binder?
Binder可以实现进程与进程之间的通信。
(1)为什么感觉Binder很陌生
(2)为什么要学习Binder
Binder在相当于一个服务接入点,我提供了服务,你要对接我,我给你提供一个接入点,这个接入点就是Binder
而对于客户端而言,binder可以看成是通向某个管道的入口,要想和某个服务进行通讯,首先要建立这个管道。
从上图来看,个人电脑是客户端,应用服务器就是系统提供的一些服务,而binder就相当于是路由器,而ServiceManager就相当于一个DNS服务器,
没有路由器就不能上网,所以如果没有binder就不能访问其他进程和服务。
例如上图,如果可客户端想发起请求,查询www.google.com的网址,那么到了路由器以后就会通过serviceManager去查询有没有这个网址,如果没有,就返回404;
如果有,那么就将www.google.com对应的ip地址:192.168.245.123返回给客户端,然后客户端在去请求这个地址,然后服务器在将数据返回请求的数据。
2:Binder的由来
原来Linux内核提供了很多进程间的通讯,他尝试了很多方式,比如socket,共享内存等等,管道通常指的是半双工管道,指的就是A给B通讯,B给A通讯,是两件事情,有点类似于对讲机
Binder机制通讯的时候就会对通讯双方都进行一个身份验证,所以他是安全的。
传统的ipc协议,把数据进行管道中,容易被拦截。
android每个安装的apk都会分配uid,就是userid,pid就是进程id,基于c/s架构,传输过程仅通过一次copy。具体的后面再学习
3:Binder四个重要的角色
1:Server
2:Client
3:ServiceManager
4:Binder驱动
Clinet 和Server是相对的
前三者是用户空间,而Binder是内核空间,用户空间是不能进程间通讯的,而内核空间是可以共享空间的。
ServiceManager相当于DNS服务器,他是作为Client和Server之间的桥梁:
Client可以通过ServiceManager拿到Server中Binder实体的引用:如果服务器想给客户端提供服务,那么就需要通过ServiceManager来注册一个信息,这个信息就是Binder的引用注册到ServiceManager中,而Client如果想要访问服务器的话,就必须要提供一个key(www.google.com)和这个引用来进行访问。通过ServiceManager内部的map链表提取出来,通过这个key就可以拿到对应的引用。
而android内部都是通过Binder去跟系统进行交互的,比如获取音量
getSystemService(Context.AUDIO_SERVICE);
Servicemanager提供注册的时候,其实也是服务端,我们需要对很对系统的服务提供注册的功能.
ServiceManager作为服务端的时候比较特殊,他提供的Binder对象没有名字,也不需要注册,当一个进程使用Binder.setContextMgr命令把自己注册为ServiceManager的时候,Binder驱动就会自动为他创建Binder的实体,而Binder实体所在的引用所有的Client都为0,这样就可以进行进程间的通讯了。
而Binder驱动又是什么呢?
Binder驱动是负责进程之间Binder的建立,Binder是通讯的,因为进程之间根本没办法交互,所以都是通过Binder的驱动来进行交互的。
Binder驱动是一个线程池。是由Binder驱动来进行管理。一个BInder最大的线程池最大的线程数是50,
4:AIDL是什么?
AIDL:Android Interface Definition Language,是android的接口定义语言
Binder之前的通讯是需要统一一个语言,这种架构就是AIDL.
5:Binder的四个重要的对象
1:IBinder:是一个接口,代表跨进程通讯的能力或者功能,只要实现这个接口就可以跨进程传输了
2:IInterface:代表Server进程对象代表能够提供什么样的功能,什么样的方法,对应的就是AIDL定义的接口。
3:Binder:java层的Binder类,代表的就是Binder的本地对象,这里需要;了解这个BinderProxy,我们需要一个本地的代理来操 作Binder,通过BinderProxy来操作Binder。
4:Stub:就是Aidl的时候,编译工具会自动生成一个stub的静态内部类,他是继承了Binder,实现了IInterface的接口,表明具备了服务端对Clinet承诺接口的能力。他是一个抽象类,具体的实现需要我们自己去做
其中Binder和BinderProxy都是继承于IBinder的,所以他们都具备了跨进程传输的能力。实际上,在跨进程的时候,Binder驱动会自动的完成这两个对象的转换。
5:Binder的通讯机制
6:小知识补充