Binder机制的实现集合了 Android系统四大组件Client,Server,Service Manager和Binder的驱动程序。
在应用层面,Client和Server直接通过Binder进行数据交互,Client对Server中的服务发出请求, Server打开Binder写入数据,Client通过Binder读取数据。Client和Server进程这间的数据通信通过Binder驱动程序间接实现,Client和Server通过open广法和ioctl文件操作方法与Binder驱动程序进行通信。
Binder驱动程序为应用层的进程间通信提供底层支持,它是一个misc类型设备,提供设备文件/dev/binder与用户空间交互,其中驱动的代码位置如下:
kernel/drivers/staging/android/binder.h
kernel/drivers/staging/android/binder.c
应用层进程之间通信的服务由Service Manager负责,它是一个守护进程,对Android系统中所有的Service进行管理,每个Server所提供的服务需要向Service Manager注册,以供Client进行查询和获取。
1 定义一个继承于BBinder类的TopsciService类,在TopsciService类中定义了初始化insantiate函数,构造函数,析构函数以及Client与Server交互的onTransact函数
class TopsciService : public BBinder
{
mutable Mutex mLock;
int32_t mNextConnId;
public:
//初始化,实例化Topsciservice
static int instantiate();
//TopsciService构造函数
TopsciService();
//TopsciService析构函数
virtual ~TopsciService();
//打开Binder设备
virtual status_t onTransact( uint32_t, const Parcel&, Parcel*, uint32_t);
}
2 TopsciService类的具体实现
TopsciService成员函数instantiate实现了对TopsciService类初始化功能,即调用addService函数把TopsciService作为一项服务添加到ServiceManager中,完成向ServiceManager的注册工作。
static int TopsciService::instantiate()
{
int r = defaultServiceManager()->addService(String16("guilh.add"),new TopsciService());
return r;
}
TopsciService的onTransact函数实现了Client与TopsciService Server之间的具体通信,当Client准备向TopsciService发送消息时,首先创建一个Handler为0的代理对象Binder,然后Client发送请求给这个代理对象,该代理对象通过驱动把信息传递给Server,TopsciService服务读取到Client发给它的数据后,将此数据加1000送返回给Client.
TopsciService::onTransact(uint32_t code, const Parcel& data,Parcel* reply,unit32_t flags)
{
switch(code)
{
case 0:
{
pid_t pid = data.readInt32();
int num = data.readInt32(); //读取Client发送的数据
num = num+1000;
reply->writeInt32(num);//把加1000后的数据发送回客户端
return NO_ERROR;
}
break;
default:
//如果client创建的handler不为0,则调用BBinder类onTransact
return BBInder::onTransact(code,data,reply,flags);
}
}
TopsciService应用程序主入口
int main(int argc,char** argv)
{
//获得一个ProcessState实例
sp<ProcessState> proc(ProcessState::self());
//获取ServiceManager
sp<IServiceManager> sm = defaultServiceManager();
//把自己作为服务添加到ServiceManager
TopsciService::instantiate();
//启动缓冲 池
ProcessState::self()->startThreadPool();
//把服务添加到Binder闭合循环进程中
IPCThreadState::self()->joinThreadPool();
return 0;
}
Client端
class TopsciClient :public BBinder
{
int main()
{
sp<IServiceManager> sm = defaultServiceManager();
sp<IBinder> b = sm->getService(String16("guilh.add"));
if (b == NULL)
{
return -1;
}
Parcel in1 ,out1;
TopsciClient* cb = new TopsciClient();
in1.wirteInt32((int)getpid());
in1.writeInt32(0);
int ret = b->transact(0,in1,&out1,0);
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
return 0;
}
}