5.1 Parcel写入 SurfaceFlinger 实体

static_t Parcel::writeStrongBinder(const sp& val){
  return flatten_binder(ProcessState::self(), val, this);
}

在这里的例子 val 是 C++的服务 SurfaceFlinger


5.1 Parcel写入 SurfaceFlinger 实体_第1张图片
SurfaceFlinger 架构

因此这里的 IBinder 就是 SurfaceFlinger 的父类 IBinder

status_t flatten_binder(const sp&, const sp& binder, Parcel* out){
  flat_binder_object obj;
 if(binder != NULL) {
    //可以暂停先看 1,看看 locakBinder( )是个什么东西。
    IBinder *local = binder->localBinder( );
    if(!local){
      //此时 local 便是 SurfaceFlinger,便不会进入这里,
      //再补充一句,进入这里说明 local 为空,此时的 IBinder 其实就是代理类型了
      //下次碰到再说代理类
      BpBinder *proxy = binder->remoteBinder( );
      ...
    } else{
      //表示传递的是 Binder 实体
      obj.type = BINDER_TYPE_BINDER;
      obj.binder = reinterpret_cast(local->getWeakRefs( ));
      obj.cookie = reinterpret_cast(local);
    }
  }else{
    ...
  }
  return finish_flatten_binder(binder, obj, out);
}

inline static status_t finish_flatten_binder(const sp& , const flat_binder_object& flat, Parcel* out){
  return out->writeObject(flat, flase)
}
//Binder.cpp
BBinder* IBinder::localBinder( ){
  return NULL;
}

BBinder* BBinder::locakBinder( ){
  return this;
}

我们知道在 Server 端和 Client 端的 Binder 是有不同的架构的, 我们当前的 IBinder 是 Server 端的服务 SurfaceFlinger,因此这里返回的便是 SurfaceFlinger 的指针。


于是,这个SurfaceFlinger 服务本地对象边被转换成 flat_binder_object 在存储在 Parcel 中传递给 Binder 驱动。其中 type = BINDER_TYPE_BINDER表明传递的是实体,binder 保存了这个服务对象的弱引用计数对象,cookie 保存了该服务对象的指针。

你可能感兴趣的:(5.1 Parcel写入 SurfaceFlinger 实体)