本文的主要通过一些其他资料,跟上binder的代码,形成自己对binder机制的一些理解。
1:类简介:
ProcessState:1:单例2:构造函数中打开binder设备,并通过mmap映射到内存。3:拥有设置和获取服务端代理的功能函数getContextObj和setContextObj,其中有个特殊客户端获取servicemanager的代理也是通过这个,只不过传的handler为0。
BpBinder:1:构造函数中会接受一个handler标示,并且会打开IPCThreadState2:有一个transact方法被BpXXX调用,用来传送客户端向服务端发送的命令请求。
BbBinder:1:与BpBinder相对应2:有一个transact方法被IPCThreadState中在获取到客户端的请求后调用,该方法里会调用到自己的onTransact方法执行真正的服务端方法调用。
IPCThreadState:1:单例 2:拥有ProcessState实例3:初始化mOut,mIn4:拥有与binder驱动沟通的函数sendReply,waitForResponse,talkWithDriver,writeTransactionData,executeCommand 4:拥有transact,被BpBinder的transact调用,用来向binder驱动写入客户端请求并等待接受binder发送的服务端的调用结果。
IInterface:1:IXXX的基类 2:通过模板定义interface_cast函数,通过该函数调用到模板类IXXX的asInterface方法将BpBinder转成IXXX 3:定义DECLARE_META_INTERFACE宏 该宏被IXXX类的头文件里调用 展开宏得到IXXX类的asInterface方法的声明 IXXX类的getInterfaceDescriptor方法的声明 以及IXXX的构造函数和析构函数声明。 4:定义IMPLEMENT_META_INTERFACE宏,该宏被IXXX类源文件调用,展开得到DECLARE_META_INTERFACE宏的声明的函数的实现。
IXXX:1:IInterface的子类。2:BnInterface和BpInterface的父类。3:定义服务端对客户端提供的接口。
BnInterface:1:继承于IXXX和BBinder 2:BnXXX的父类
BpInterface:1:继承于IXXX和BpRefBase 2:BpXXX的父类
BpXXX:1:BpInterface的子类 2:拥有一个BpBinder的实例3:他是service的Binder在客户端的代理,实现了IXXX里定义的服务端对客户端提供的接口,实现方式是接受到客户端传过来的参数和请求,通过BpBinder的transact方法发送到Binder驱动。
BnXXX:1:BnInterface的子类2:他是servcie的binder在本地端的代理,是和BpXX对应的和BpXXX打交道的一个类,只要是通过onTransact获取BpXXX发过来的命令,然后执行服务端的接口调用。
2:binder类图结构:(类图转自网络)