美文网首页
Android Framework学习之Binder对象跨进程传

Android Framework学习之Binder对象跨进程传

作者: 一只二凡子 | 来源:发表于2022-12-26 09:10 被阅读0次

    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

    相关文章

      网友评论

          本文标题:Android Framework学习之Binder对象跨进程传

          本文链接:https://www.haomeiwen.com/subject/ytghqdtx.html