android内核剖析 binder读书笔记

读书笔记的目的是为了帮助自己更好的理解书中的内容,等看过一段时间有所遗忘时,帮助自己重新记忆。还可以帮助也在看这本书的童鞋一起理解,共同进步

如果需要转载,请注明出处!

 

Binder是一种架构,可以帮助客户端去调用服务端的服务。

这种架构和我们自己平时开发时,http请求调用接口访问数据库数据的架构十分像:本地发起请求,通过一个中间层转发,服务端拿到请求,再通过中间接口整理数据的结构,返给客户端一个可以解析的数据模型,比如JSON之类的。

 

下面是Binder的框架:


(来自Android内核剖析)

 

从图上可以看出整个Binder框架中存在2Binder对象,一个是服务器用来处理具体业务的Binder,他会调用一个隐藏的线程来接收来自binder驱动的数据,然后调用onTranscat()来处理具体的业务。

 

然后我们来看下transcat是如何处理具体业务的

 

这张图是android Binder的源码。

整个方法会接受来自驱动的4个参数。

 1.int code 是服务端和客户端定的协议。用不同的数字是标识不同的业务,调用不同的方法。这种做法十分常见,比如在http协议中404就代表找不到网页。举个例子帮助理解下,比如在服务端处理一个虚拟宠物的吃喝拉撒。客户端是一个养宠物的软件。客户端调用驱动的remoteBinder传给服务器一个code=1000,代表宠物要吃饭了,code =1001,代表睡觉。服务端的Binder,在onTransact中就可以根据code来判断具体执行什么操作了。

2.Parcel data 

 

binder中定义一种存取数据的数据结构,类型用于的信封,客户端从邮局获得一个信封(Parcel.obtain()),然后把要传递的数据放进信封,交给邮差(现在都是快递员了),邮差就扮演了驱动的角色,然后把数据送给服务端。要注意的是data中的存储数据的顺序必须与服务端一起确定。

3.Parcel reply 是交给驱动的一个反馈。比如接着刚刚那个例子说

 

客户端告诉服务端,宠物要吃饼干了。

服务端根据codedata调用eat()方法,然后把结果放进reply 中,通过驱动告诉客户端宠物心情加5,满意度加5.

 

这就是手工写一个Binder服务端与客户端的大致流程:

服务端继承Binder,重载onTranscat()方法,与客户端定一套协议,来处理业务。

然后把Binder驱动中创建一个mRemote对象

客户端要获得驱动中的mRemote对象,调用onTranscat()方法,把想干的事情,想传的数据交给驱动

 

但是这种做面临了2个困难

1.客户端怎么样才能拿到驱动中的mRemote

2.服务端每增加一个功能,都要把code告诉所有需要调用的客户端,data中的数据的顺序还不能出错。

 

继续以上2点原因,android引进了service这个概念。

 

 

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值