binder 进程间通讯关于handle一点疑问?(自己已经弄明白了一点)


疑问的提出:


每个服务通过调用ServiceManger的接口addService会将自己的名字和handle加入到servcemanger进程的svrlist列表里,但是这个handle是怎么来的呢???
我只知道servcemanger是固定死了是0,其他的服务呢?



以CameraService为例

mediaserver启动,创建Camera服务端
CameraService::instantiate();
         --> defaultServiceManager()->addService("media.camera",new CamraService)
                --> IServiceManger::addService
                     {
                             Parcel data
                             data.writeString16("android.os.IServiceManger");
                             data.writeString16(name);
                             data.writeStrongBinder(service);
                                       -->flatten_binder(ProcessState::self(), service, this); //就在这个函数里有点疑问                
                              IPCThreadState::transact(data);
                   }

flatten_binder函数源码:
status_t flatten_binder(const sp<ProcessState>& proc,
    const sp<IBinder>& binder, Parcel* out)
{
    flat_binder_object obj;
   
    obj.flags = 0x7f | FLAT_BINDER_FLAG_ACCEPTS_FDS;
    if (binder != NULL) { //执行这个分支
        IBinder *local = binder->localBinder(); //由于CameraService是继承于BBinder,所以local返回对象实列,local是不空的
        if (!local) {
            BpBinder *proxy = binder->remoteBinder();
            if (proxy == NULL) {
                LOGE("null proxy");
            }
            const int32_t handle = proxy ? proxy->handle() : 0;
            obj.type = BINDER_TYPE_HANDLE;
            obj.handle = handle;
            obj.cookie = NULL;
        } else { //执行这个分支
            obj.type = BINDER_TYPE_BINDER;
            obj.binder = local->getWeakRefs();
            obj.cookie = local;

        }
    } else {
        obj.type = BINDER_TYPE_BINDER;
        obj.binder = NULL;
        obj.cookie = NULL;
    }
   
    return finish_flatten_binder(binder, obj, out);
}
将这个 flat_b
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
是的,Binder进程通信(IPC)机制可以实现跨进程调用原进程的方法。 在Binder IPC中,存在客户端和服务端两个角色。客户端通过Binder代理(Proxy)向服务端发送请求,而服务端通过Binder存根(Stub)接收请求并执行相应的方法。 当客户端向服务端发送请求时,可以通过Binder IPC机制实现跨进程调用原进程的方法。具体步骤如下: 1. 客户端调用:客户端通过Binder代理(Proxy)调用服务端的方法,并传递相应的参数。 2. 数据传输:客户端将方法调用请求和参数打包成一个Parcel对象,并通过Binder IPC机制将该Parcel对象发送给服务端。 3. 服务端接收:服务端在接收到客户端的请求后,通过Binder存根(Stub)解析接收到的Parcel对象,并提取出方法调用请求和参数。 4. 方法执行:服务端根据解析得到的方法调用请求和参数,执行相应的方法。 5. 返回结果:在方法执行完毕后,服务端将返回的结果打包成一个Parcel对象,并通过Binder IPC机制将该Parcel对象发送回客户端。 6. 客户端接收:客户端在接收到服务端返回的结果后,通过Binder代理(Proxy)解析接收到的Parcel对象,提取出返回结果。 需要注意的是,跨进程调用原进程方法需要在服务端实现相应的方法,并且确保方法的调用参数和返回能够正确地在进程进行序列化和反序列化。此外,由于跨进程调用涉及到进程的通信,因此需要注意线程安全和数据一致性的问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值