Framework是一个中间层,它对接了底层实现,封装了复杂的内部逻辑,并提供供外部使用的接口。Framework层是应用程序开发的基础。
Binder Framework层分为C++和Java两个部分,为了达到功能的复用,中间通过JNI进行衔接。
Binder Framework的C++部分,头文件位于这个路径:/frameworks/native/include/binder/,实现位于这个路径:/frameworks/native/libs/binder/ 。Binder库最终会编译成一个动态链接库:libbinder.so,供其他进程链接使用。
为了便于说明,下文中我们将Binder Framework 的C++部分称之为libbinder。
主要结构
libbinder中,将实现分为Proxy和Native两端。Proxy对应了上文提到的Client端,是服务对外提供的接口。而Native是服务实现的一端,对应了上文提到的Server端。类名中带有小写字母p的(例如BpInterface),就是指Proxy端。类名带有小写字母n的(例如BnInterface),就是指Native端。
Proxy代表了调用方,通常与服务的实现不在同一个进程,因此下文中,我们也称Proxy端为“远程”端。Native端是服务实现的自身,因此下文中,我们也称Native端为”本地“端。
这里,我们先对libbinder中的主要类做一个简要说明,了解一下它们的关系,然后再详细的讲解。
类名 说明
BpRefBase RefBase的子类,提供remote()方法获取远程Binder
IInterface Binder服务接口的基类,Binder服务通常需要同时提供本地接口和远程接口
BpInterface 远程接口的基类,远程接口是供客户端调用的接口集
BnInterface 本地接口的基类,本地接口是需要服务中真正实现的接口集
IBiner Binder对象的基类,BBinder和BpBinder都是这个类的子类
BpBinder 远程Binder,这个类提供transact方法来发送请求,BpXXX实现中会用到
BBinder 本地Binder,服务实现方的基类,提供了onTransact接口来接收请求
ProcessState 代表了使用Binder的进程
IPCThreadState 代表了使用Binder的线程,这个类中封装了与Binder驱动通信的逻辑
Parcel 在Binder上传递的数据的包装器