Binder机制简单分析

来源:互联网 发布:佛山淘宝代运营 编辑:程序博客网 时间:2024/04/28 22:57
Binder机制简单分析
一.操作系统层面分析
在操作系统中,进程与进程之间是相互独立的,他们拥有独立的虚拟内存,独立的资源,每个进程拥有独立的代码段CS,堆栈段SS,数据段DS等,进程间的运行互不影响,统一由系统调度。应用进程运行在用户空间,用户空间的程序的权限是很低的,而内核空间则拥有整个计算机的控制权限,包括操作系统内部权限,对硬件,网络的访问控制权限。而用户空间想访问受限的资源必须通过系统调用,陷入内核,经内核检验才能完成调用。而进程之间是不能直接相互通信的,一个进程要与另一个进程通信,必须先通过内核,再有内核向另一个进程通信。
基于上述情况,Android中进程之间的通信设计了一个之间媒介,即Binder驱动。这里假设一个应用进程称为server端,一个应用进程称为client端,他们间通过Binder进行通信,其过程入下:
当server端启动时,它向内核注册(IPC)自己的信息(联系方式,提供的服务接口),这时内核就拥有该server对应的一个Binder数据结构。此时,client端想调用server端的服务接口,则它会向内核发送一个请求,这时候内核也就拥有client对应的一个Binder数据结构。接着内核会向client发送server端的Binder代理(并不是server端Binder本身,只是一个代理)。client接受到该server端的Binder代理后就可以在其上面做相关操作,然后返回给内核,内核会把执行操作返回给server端的Binder,然后server端就可以根据该Binder做出计算再返回结果给内核,内核再返回给client端。
总之,server进程和client进程端是不直接交互的,而是通过内核做中间媒介,client端的Binder只是server端Binder的一个代理,是不同的对象。


二.Java代码层面分析
首先分清几个概念
1.IBinder:接口,声明一种跨进程通信的能力,跨进程间通信必须实现该接口,Android系统会识别实现这个接口的对象,于Binder驱动绑定。
2.Binder:Binder于其内部类ProxyBinder都实现了IBinder接口,Binder代表本地Binder对象,ProxyBinder代表远程Binder对象。Android系统自动实现这两个对象的转换。
3.IInterface:声明对象跨进程时对为提供的接口。
4.AIDL中的stub类,该类继承了Binder并实现了IInterface接口,它代表本地Binder对象,具有跨进程通信的能力,同时具有远程接口功能的调用,我们需要手动实现stub类并实现IInterface接口,来实现具体的功能,是一直策略模式。


当创建一个A.aidl文件时(这里称为接口A),会自动在gen目录下生成对应的A.java 文件
1.A会自动继承IInterface接口,并生成在aidl中声明的接口。
2.A会自动生成一个Stub内部类,Stub继承Binder,实现A接口。我们在使用时要继承的是Stub内部类,并实现其继承的A接口的方法来实现业务逻辑。Stub的主要内部原理如下:
2.1 asInterface(IBinder obj)方法:obj是服务端的,如果服务端是于该客户端在同一个进程的,则直接返回服务端的IBinder对象(Stub);如果服务端于客户端在不同进程,则以该服务端的IBinder构造出一个Proxy代理,返回给客户端。
2.2 boolean onTransact(code,data,reply,flags):该方法运行在服务端,code表示调用的方法代号,data表示方法参数,reply为返回结果。该方法的返回true表示请求成功,返回false表示请求失败,所有可以在服务端供验证使用。
2.3当客户端调用服务端的方法是,客户端的线程会被挂起,直到服务端返回结果回来,所有,客户端如果运行的UI线程则需要重新开启线程。

0 0
原创粉丝点击