主要成员
我们先来梳理下Binder通信的几个重要的成员:
1.Binder驱动
2.应用
3.系统服务
4.Binder
其中应用和系统服务处于不同的进程,由靠Binder驱动进行信息交互。
在网购如此发达的现在,人人都清楚淘宝上的聊天流程。
在这个过程中,也有对应的部分:
1.淘宝
2.用户
3.店家
4.聊天窗口
注:真实的淘宝通信系统肯定有所不同,这里仅提取与Binder通信相近之处。
再注:本来想举微信聊天的例子,但是微信聊天中客户端和服务端的属性没那么明显,所以选择淘宝聊天流程。
1 | 应用和系统服务处于不同进程 用户没在商家身边 |
聊天窗口
在用户和商家通信过程中,什么东西最重要呢?其实就是“聊天窗口”。
假设我们设计一个聊天系统,“聊天窗口”会有哪些重要的属性?
1.它是一个对象;
2.淘宝系统内部有一个地址k可以访问到它;
3.一端是用户,可以通过地址c访问到它;
4.另一端是商家,可以通过地址s访问到它。
同时也要需要解决很多问题,比如:
1.如何让用户联系到商家;
2.一个用户需要同事联系多个商家;
2.一个商家需要同时服务多个用户;
3.会不会有人把自己伪造成其他人等等。
Binder
与“聊天窗口”类似,Binder也有对应的属性:
1.它是一个对象;
2.Binder驱动有一个地址k可以访问到它;
3.一端是应用,可以通过地址c访问到它;
4.另一端是系统服务,可以通过地址s访问到它。
同样也需要解决很多问题,比如:
1.如何让应用联系到系统服务;
2.一个应用需要同事联系多个系统服务;
2.一个系统服务需要同时服务多个应用;
3.会不会有应用把自己伪造成其他应用等等。
主要流程
让我们看看,用户如何联系到商家:
同样在Binder中,也有一套这样的流程:
这张图片清晰表述了整个流程
1.打开Binder驱动;
2.将系统服务中地址s和Binder驱动中地址k指向同一地址;
3.将应用地址c和Binder驱动中地址k指向同一地址。
整个过程结束后,应用中地址c和系统服务中地址s也指向同一地址。这样两个不同的进程就关联成功了。
ServiceManager
其中有一个重要的问题,应用如何找到Binder驱动中的地址k?
在每次Android重启后,Binder驱动中地址k都不相同,应该怎么办?
怎么解决这个问题呢?
首先想到的方法,每次都记录下这些服务,下次启动时从备份文件中读取。
这个方法看上去很干脆利落,但是有一个风险。
如果上次服务发生异常,备份文件中也记录错误的数据,那这个手机就完了,永远无法启动。
需要改变下策略,希望每次Android系统重启时,这些系统服务都是新生成的。
这些系统服务启动时没有历史包袱一身轻松,然后愉快的注册到服务管理中心中。
应用只需要向服务管理中心查询服务名,就可以获取到地址k。
在Binder通信,这个服务管理中心就是ServiceManager,它管理所有的服务。
主要完成这两项任务:
1.所有的系统服务启动时,需要把服务名字和服务记录到ServiceManager中;
2.所有的应用使用指定系统服务前,先根据服务名称去向ServiceManager索要服务。
注:上面步骤中,按照C/S架构中划分:
1.系统服务是客户端,ServiceManager是服务端;
2.应用是客户端,ServiceManager是服务端。
我们看下Binder通信流程图:
再加入Binder驱动元素:
回到我们的例子,淘宝也有一个ServiceManager的角色,就是店铺黄页。
店铺黄页管理所有的店铺,也完成两项任务:
1.每个商家上线后都会去淘宝黄页注册,比如Nike店铺注册Nike;
2.用户去淘宝黄页询问Nike的商家,获取聊天窗口中店铺的地址。
这时细心的读者会发现一个问题,ServiceManager呢,这些系统服务和应用怎么找到它呢?
为了解决这个问题,Android系统不得不做例外处理:
1.在Android启动后,ServiceManager第一个初始化;
2.将自己编号设为0。
之后,无论是应用或者系统服务,都可以通过编码0访问到ServiceManager。
后记:在上大学时去图书馆随便翻书看过到多米尼克,感慨这个世界群星璀璨,有各种天才。
他发明的多米尼克训练法,告知人们需要用串联、转化、联想等等法则去记忆。
在学习Android底层中,有太多的对象和函数,如果能将其中主要流程和真实生活产生对应,会加速学习过程,而且印象深刻。
多米尼克·奥布莱恩,1957年8月10出生于英国。1991年,他参加了由“世界大脑先生”托尼·布赞发起的第一届世界记忆锦标赛,凭其独创的“多米尼克记忆系统”,38秒记住一副扑克牌的顺序,30分钟记住2385个随机产生的数字,1个小时记住110种元素的原子序数、符号、类别和精确到4位小数的原子量,一时技惊四座,横扫所有对手,获得第一届世界记忆锦标赛的总冠军。此后十余年间,他先后获得8次世界记忆冠军,几乎打破所有记忆领域的世界纪录,成为举世公认的“世界首席记忆大师”。