android IPC binder -- client/server与service manager交互流程

一、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,包含了一个句柄值为0Binder引用

 

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来代替它。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值