C++ binder 實現

Nio96發表於2014-07-31

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;

}

}

相關文章