一、service_manager. Client/Server <---> service manager 交互流程
server ---------addservice--------> service manager
client ---------getservice--------> service manager
1. Service_manager server 端代码。
mips-gingerbread\frameworks\base\cmds\servicemanager\ service_manager.c
binder.c binder.h
int main(int argc, char **argv)
{
struct binder_state *bs;
void *svcmgr =BINDER_SERVICE_MANAGER;
bs = binder_open(128*1024);
if(binder_become_context_manager(bs)) {
LOGE("cannot becomecontext manager (%s)\n", strerror(errno));
return -1;
}
svcmgr_handle = svcmgr;
binder_loop(bs,svcmgr_handler);
return 0;
}
1. Service_manager client proxy 端代码。
defaultServiceManager()->addService(
String16("media.player"),new MediaPlayerService());
1) defaultServiceManager
单例模式
sp<IServiceManager> defaultServiceManager()
{
if (gDefaultServiceManager !=NULL) return gDefaultServiceManager;
{
AutoMutex_l(gDefaultServiceManagerLock);
if (gDefaultServiceManager== NULL) {
gDefaultServiceManager = interface_cast<IServiceManager>(
ProcessState::self()->getContextObject(NULL));
}
}
return gDefaultServiceManager;
}
其实gDefaultServiceManager 最终等价于以下代码
gDefaultServiceManager = new BpServiceManager(new BpBinder(0));
这样,Service Manager远程接口就创建完成了,它本质上是一个BpServiceManager,包含了一个句柄值为0的Binder引用。
2) defaultServiceManager()->addService()
virtual status_taddService(const String16& name, const sp<IBinder>& service)
{
Parcel data, reply;
data.writeInterfaceToken(IServiceManager::getInterfaceDescriptor());
data.writeString16(name);
data.writeStrongBinder(service);
status_t err = remote()->transact(ADD_SERVICE_TRANSACTION, data,&reply);
return err == NO_ERROR ?reply.readExceptionCode() : err;
}
status_t BpBinder::transact(
uint32_t code, constParcel& data, Parcel* reply, uint32_t flags)
{
// Once a binder has died, itwill never come back to life.
if (mAlive) {
status_t status = IPCThreadState::self()->transact(
mHandle, code, data, reply, flags);
if (status == DEAD_OBJECT)mAlive = 0;
return status;
}
return DEAD_OBJECT;
}
3) BnServiceManager这个类没有用到,由service_manager.c来代替它。