Android之Binder初探
一、概述
Binder是一种基于C/S架构的跨进程通信方式,由于Linux系统的用户空间地址不可共享而内核空间地址可以共享的机制在Android系统中并未改变,在Android内核层仍然要为Binder提供了设备驱动/dev/binder,在Linux系统中不存在这种IPC。
Binder通信机制
二、内核层
Android的系统架构是层次分明的,最底层自然是ARM开发板这种物理硬件,物理硬件想要运行起来(比如Wi-Fi模组要辐射信号)就得依赖驱动程序,当开发人员通过C、C++写驱动程序的时候,他们其实就是在构建内核层。硬件设备有了驱动程序,就像风车遇到风一样可以立即运行起来。既然有了驱动就可以运行起来,为何还要搞那么多层级呢?
因为需要!
三、硬件抽象层
驱动程序对硬件强依赖,不同的型号厂家就得用不同的驱动,为了解决这个问题,就必须把这些个厂家统一起来标准化。有了标准,硬件设备向外部提供定制化的接口,开发者通过调用这些标准接口来完成相应的驱动任务。这些统一的标准就是硬件抽象层。大哥大就是在这个时候诞生的!你是否还记得当年的大哥大是没有屏幕的? 大哥大四、系统服务层
时光荏苒,岁月蹉跎。大哥大作为一种潮流风光无限的时候,Java诞生了。这种可移植性强、平台兼容度高的语言很快就得到了普及。Java和C是两种语言,不能直接通信,所以就有了JNI。Java调用原生的动态so库,然后重新封装就有了系统服务层。
最先完成这个骚操作的是摩托罗拉和诺基亚,他们迅速打磨出一种新的移动设备,可以随身携带,故而命名为手机,引领全球十年。在这十年中,他们不断追求的是手机怎么蓄电时间长,如何抗损坏,这种硬件思维一直挥之不去!
时代的潮流,像洪水猛兽般滚动向前,不会给人片刻停留驻足的机会!
五、Android系统服务层
就在某年某月某日的某一天,乔帮主悍然发动了对功能机的滑铁卢,在iPhone4的强大冲击下,一个时代悄悄落幕!
这一切,被躲在暗处的Google看的真真切切,不到两年的时间里基于Java语言的新系统Android诞生了。通过开源的战略布局迅速拿下移动互联时代的半壁江山。
系统服务层毕竟是Android系统提供的服务,也就是对硬件抽象层的二次封装。为何就能这么迅速的占领市场呢?答案就是IPC。
Android系统的每个服务单独运行在一个进程中,用户要使用这些服务仍然比较麻烦,换句话说仍然绕不开驱动的魔咒。能不能让用户不关心这些,只专注于应用开发呢?Google给出了肯定的答案!
六、应用框架层
方案就是在此基础上再封装一次,应用框架层出现了。而且它通过四大基础组件供用户使用,来覆盖视觉活动、自主服务、广播通信和信息传递的功能,并通过各种工具类完成对多媒体、网络、蓝牙、通话、短信、照相机等的使用需求。由于系统服务层每一个进程负责一项单独的服务,供应用框架层调度,这次功能相互独立又相辅相成,演变出千变万化的应用。
既然是服务端的调度,采用C/S架构的Binder跨进程通信机制就再合适不过了。那Binder又是如何完成跨进程通信的呢?
Binder将所有的服务注册在一个叫ServiceManager的类里面,客户端有什么需要尽管打招呼,所有的系统服务都在这里面。
当然,为了提高Binder的效率最大化,系统还基于Binder机制封装了aidl文件、Messenger、Service等,做了技术延伸,方便用户开发C/S架构的功能需求,尤其是跨进程需求。
虽然讲的头头是道,然而并没有什么卵用?只是希望大家在面试时候,不要去背《Android开发艺术探索》这本书里的东西,那是刚哥的理解,早被人用烂了,咱们得有自己的观点。