binder对象跨进程传递的原理是怎样的?
![](https://img.haomeiwen.com/i1785861/825f3657c94006b2.jpg)
![](https://img.haomeiwen.com/i1785861/46810694ae87200f.jpg)
AIDL接口定义
![](https://img.haomeiwen.com/i1785861/a88ce26f81cb08e3.jpg)
publishBinder:将ICallback(binder对象)发布到另外一个进程
![](https://img.haomeiwen.com/i1785861/d32f7a943a452485.jpg)
AIDL接口定义生成的Proxy类的binder实现
_data.writeStrongBinder(callback != nulll ? callback.asBinder() : null): 将callback binder对象写入 _data parcel 里
mRemote.transact: 将_data 发出去
![](https://img.haomeiwen.com/i1785861/6144cb25a2c796e2.jpg)
client端的Proxy将请求发出去后,经过binder驱动转发后到了Server的onTransact,
data.readStrongBinder: 将binder对象从data parcel里读出来
![](https://img.haomeiwen.com/i1785861/281beda59202602f.jpg)
mNativePtr:parcel在native层对应的parcel对象的指针
ibinderForJavaObject:根据Java层传进来的java对象object找到native层的binder对象
parcel->writeStrongBinder: 将native层的binder对象写入native层的parcel里
![](https://img.haomeiwen.com/i1785861/803ec3343cbb3ba7.jpg)
isInstanceOf(obj, gBinderOffsets.mClass): 如果 obj是一个实体对象,它里面有个变量保存了native层JavaBBinderHolder对象的指针
jbh->get: 得到native层的binder对象,类型是JavaBinder
isInstanceOf(obj, gBinderProxyOffsets.mClass):如果 obj是一个Proxy对象,这个proxy对象保存了native层的proxy对象的指针
![](https://img.haomeiwen.com/i1785861/9453f7c22d5c5b6e.jpg)
![](https://img.haomeiwen.com/i1785861/3de505f2deab06f1.jpg)
![](https://img.haomeiwen.com/i1785861/8654d96f3e271c51.jpg)
驱动层
![](https://img.haomeiwen.com/i1785861/0ccc0d1353ab4241.jpg)
目标进程
![](https://img.haomeiwen.com/i1785861/3d67f904c9e6f18e.jpg)
![](https://img.haomeiwen.com/i1785861/73438e9daa9e24ac.jpg)
跨进程传递binder对象时,在驱动层有个转换过程,将实体对象转换成代理对象,同一进程的话就没有转换
![](https://img.haomeiwen.com/i1785861/7a22512bc3636e09.jpg)
![](https://img.haomeiwen.com/i1785861/8dfc02edd0591492.jpg)
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
网友评论