static_t Parcel::writeStrongBinder(const sp<IBinder>& val){
return flatten_binder(ProcessState::self(), val, this);
}
在这里的例子 val 是 C++的服务 SurfaceFlinger
因此这里的 IBinder 就是 SurfaceFlinger 的父类 IBinder
status_t flatten_binder(const sp<ProcessState>&, const sp<IBinder>& 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<uintptr_t>(local->getWeakRefs( ));
obj.cookie = reinterpret_cast<uintptr_t>(local);
}
}else{
...
}
return finish_flatten_binder(binder, obj, out);
}
inline static status_t finish_flatten_binder(const sp<IBinder>& , 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 保存了该服务对象的指针。