学习binder笔记

aidl流程

servcie创建.adil文件,.aidl文件用到的类需要手动import,参数要用in out inout, .aidl文件只是IDE为了帮助生成接口文件而写的,.adil生成的接口文件中只有我们需要对外部提供的方法,和一个 stub内部类,这个内部类继承了Ibinder,并实现了我们的接口文件,stub中的常量表示方法的编号,当客户端调用的时候,实际上调用的是空方法,只是把编号传到服务端,服务端在onTransact()中收到消息,根据编号来进行实际的方法调用. stub对象中asinterface方法中会判断调用这是否是同一进程,是同一进程会直接返回,不是则返回Stub.proxy代理,proxy是客户端实现的Binder对象 对服务端的接口没有进行实现,只是对远程调用进行了包装,将参数,调用方法的编号打包成一个数据包来进行远程调用。

BinderPool

当有很多个业务的时候,.aidl会有很多个,我们可以用一个BinderPool来管理这些服务,有一个专门用来查询的aidl,在Service 的onbind 就返回这个binder过去, 客户端接收到这个binder 就可以 通过这个Binder来根据业务来查询需要binder.这样可以减少Service的数量,统一起来,方便维护管理

Binder

  • 特点:面向对象的ipc,只有一次拷贝,安全,C/S架构

  • 传统的IPC ,管道/消息队列(拷贝次数多),socket(开销大,效率低),共享内存(控制复杂,难以使用),安全性低,无法识别发送方UID/PID,不能判断身份,由于是开放式,知道管道命名/ip 就可以连接,无法控制接入的程序,所以用Binder,安全性高,效率快,传输过程只需一次拷贝,由内核给发送方添加身份标识

  • Server创建了Binder实体,将这个实体和名字 以数据包的形式发送给Binder驱动,Binder驱动会为这个实体创建位于驱动的引用,并将这个引用和名字发送给SMG,SMG收到后会把名字和引用填入一张表中,当client要访问这个Binder时通过Binder驱动把名字发送给SMG,SMG会查找这张表,并把引用返回给Client,Client就拿到了这个Binder的引用,调用方法的时候会将Binder引用,参数,方法编号传到Binder驱动,Binder驱动会接收到后,会将这个引用替换为驱动之前创建的Binder实体,再发送给服务端,服务端执行ontransact()方法执行具体实现

注册服务过程

创建processState,每个进程都会有一个,在构造中打开了binder驱动,指定线程池大小,映射内存,通过process.getcontextObject中指定handle为0,拿到SMG的BpServer(具体实现在服务端),调用addservice 传入名字和实体,将参数打包,交给BpBinder进行发送,调用ontranct(),实际上BpBinder交给了 IPCthreadState.ontranct执行,它创建了,binder_transaction_data,将方法编号,目的地(BpBinder),参数,返回值打包发送给驱动,驱动接收后会根据handle值来查找位于内核的节点,并把target.ptr替换成实体,发送给接收方,SMG接收到之后根据传过来的参数调用方法,将binder引用添加到表里

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值