binder对象跨进程传递的原理是怎样的?
AIDL接口定义
publishBinder:将ICallback(binder对象)发布到另外一个进程
AIDL接口定义生成的Proxy类的binder实现
_data.writeStrongBinder(callback != nulll ? callback.asBinder() : null): 将callback binder对象写入 _data parcel 里
mRemote.transact: 将_data 发出去
client端的Proxy将请求发出去后,经过binder驱动转发后到了Server的onTransact,
data.readStrongBinder: 将binder对象从data parcel里读出来
mNativePtr:parcel在native层对应的parcel对象的指针
ibinderForJavaObject:根据Java层传进来的java对象object找到native层的binder对象
parcel->writeStrongBinder: 将native层的binder对象写入native层的parcel里
isInstanceOf(obj, gBinderOffsets.mClass): 如果 obj是一个实体对象,它里面有个变量保存了native层JavaBBinderHolder对象的指针
jbh->get: 得到native层的binder对象,类型是JavaBinder
isInstanceOf(obj, gBinderProxyOffsets.mClass):如果 obj是一个Proxy对象,这个proxy对象保存了native层的proxy对象的指针
驱动层
目标进程
跨进程传递binder对象时,在驱动层有个转换过程,将实体对象转换成代理对象,同一进程的话就没有转换
binder对象是怎么跨进程传输的?
通过Parcel传输的,client端通过writeStrongBinder写到Parcel,目标进程通过readStrongBinder从Parcel里读取出来
binder通过flat_binder_object存储,flat_binder_object存储在binder缓冲区,parcel有一个数组保存了flat_binder_object的偏移,目标进程根据这个偏移找到flat_binder_object
Parcel传到binder驱动后,binder驱动从parcel里取出flat_binder_object对象,然后根据flat_binder_objectl里的binder对象创建一些数据结构,包括为这个binder实体对象创建binder_node,binder_ref
目标进程根据binder_ref的handle创建BpBinder
BpBinder往上传到BinderProxy,再到业务层的Proxy
网友评论