Android中怎么利用Binder实现跨进程通信
Android中怎么利用Binder实现跨进程通信,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
创新互联建站2013年开创至今,先为通辽等服务建站,通辽等地企业,进行企业商务咨询服务。为通辽企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
目录
Binder到底是什么?
中文即 粘合剂,意思为粘合了两个不同的进程
网上有很多对
Binder
的定义,但都说不清楚:Binder
是跨进程通信方式、它实现了IBinder
接口,是连接ServiceManager
的桥梁blabla,估计大家都看晕了,没法很好的理解我认为:对于
Binder
的定义,在不同场景下其定义不同
在本文的讲解中,按照 大角度 -> 小角度去分析Binder
,即:
先从 机制、模型的角度去分析 整个
Binder
跨进程通信机制的模型其中,会详细分析模型组成中的
Binder
驱动再 从源码实现角度,分析
Binder
在Android
中的具体实现
从而全方位地介绍 Binder
,希望你们会喜欢。
2. 知识储备
在讲解Binder
前,我们先了解一些基础知识
2.1 进程空间分配
一个进程空间分为 用户空间 & 内核空间(
Kernel
),即把进程内 用户 & 内核 隔离开来二者区别:
进程间,用户空间的数据不可共享,所以用户空间 = 不可共享空间
进程间,内核空间的数据可共享,所以内核空间 = 可共享空间
进程内 用户 与 内核 进行交互 称为系统调用
2.2 进程隔离
为了保证 安全性 & 独立性,一个进程 不能直接操作或者访问另一个进程,即Android
的进程是相互独立、隔离的
2.3 跨进程通信( IPC
)
隔离后,由于某些需求,进程间 需要合作 / 交互
跨进程间通信的原理
先通过 进程间 的内核空间进行 数据交互
再通过 进程内 的用户空间 & 内核空间进行 数据交互,从而实现 进程间的用户空间 的数据交互
而Binder
,就是充当 连接 两个进程(内核空间)的通道。
3. Binder 跨进程通信机制 模型
3.1 模型原理
Binder
跨进程通信机制 模型 基于 Client - Server
模式,模型原理图如下:
相信我,一张图就能解决问题
3.2 额外说明
说明1:Client
进程、Server
进程 & Service Manager
进程之间的交互都必须通过Binder
驱动(使用 open
和 ioctl
文件操作函数),而非直接交互**
原因:
Client
进程、Server
进程 &Service Manager
进程属于进程空间的用户空间,不可进行进程间交互Binder
驱动 属于 进程空间的 内核空间,可进行进程间 & 进程内交互
所以,原理图可表示为以下:
虚线表示并非直接交互
说明2:
Binder
驱动 & Service Manager
进程 属于 Android
基础架构(即系统已经实现好了);而Client
进程 和 Server
进程 属于Android
应用层(需要开发者自己实现)
所以,在进行跨进程通信时,开发者只需自定义Client
& Server
进程 并 显式使用上述3个步骤,最终借助 Android
的基本架构功能就可完成进程间通信
说明3:Binder请求的线程管理
Server
进程会创建很多线程来处理Binder
请求管理
Binder
模型的线程是采用Binder
驱动的线程池,并由Binder
驱动自身进行管理而不是由
Server
进程来管理的一个进程的
Binder
线程数默认最大是16,超过的请求会被阻塞等待空闲的Binder线程。所以,在进程间通信时处理并发问题时,如使用
ContentProvider
时,它的CRUD
(创建、检索、更新和删除)方法只能同时有16个线程同时工作
至此,我相信大家对
Binder
跨进程通信机制 模型 已经有了一个非常清晰的定性认识下面,我将通过一个实例,分析
Binder
跨进程通信机制 模型在Android
中的具体代码实现方式即分析 上述步骤在
Android
中具体是用代码如何实现的
4. Binder机制 在Android中的具体实现原理
Binder
机制在Android
中的实现主要依靠Binder
类,其实现了IBinder
接口下面会详细说明
实例说明:
Client
进程 需要调用Server
进程的加法函数(将整数a和b相加)即:
Client
进程 需要传两个整数给Server
进程Server
进程 需要把相加后的结果 返回给Client
进程具体步骤
下面,我会根据Binder
跨进程通信机制 模型的步骤进行分析
步骤1:注册服务
过程描述
Server
进程 通过Binder
驱动 向Service Manager
进程 注册服务代码实现
Server
进程 创建 一个Binder
对象Binder
实体是Server
进程 在Binder
驱动中的存在形式该对象保存
Server
和ServiceManager
的信息(保存在内核空间中)Binder
驱动通过 内核空间的Binder
实体 找到用户空间的Server
对象
注册服务后,Binder
驱动持有 Server
进程创建的Binder
实体
步骤2:获取服务
Client
进程 使用 某个service
前(此处是 相加函数),须 通过Binder
驱动 向ServiceManager
进程 获取相应的Service
信息具体代码实现过程如下:
此时,Client
进程与 Server
进程已经建立了连接
步骤3:使用服务
Client
进程 根据获取到的 Service
信息(Binder
代理对象),通过Binder
驱动 建立与 该Service
所在Server
进程通信的链路,并开始使用服务
过程描述
Client
进程 将参数(整数a和b)发送到Server
进程Server
进程 根据Client
进程要求调用 目标方法(即加法函数)Server
进程 将目标方法的结果(即加法后的结果)返回给Client
进程代码实现过程
步骤1: Client
进程 将参数(整数a和b)发送到Server
进程
步骤2:Server
进程根据Client
进要求 调用 目标方法(即加法函数)
步骤3:Server
进程 将目标方法的结果(即加法后的结果)返回给Client
进程
总结
下面,我用一个原理图 & 流程图来总结步骤3的内容
原理图
5. 优点
对比 Linux
(Android
基于Linux
)上的其他进程通信方式(管道/消息队列/共享内存/信号量/Socket),Binder
机制的优点有:
高效
Binder
数据拷贝只需要一次,而管道、消息队列、Socket
都需要2次通过驱动在内核空间拷贝数据,不需要额外的同步处理
安全性高
Binder
机制为每个进程分配了UID/PID
来作为鉴别身份的标示,并且在Binder
通信时会根据UID/PID
进行有效性检测传统的进程通信方式对于通信双方的身份并没有做出严格的验证
如,
Socket
通信ip
地址是客户端手动填入,容易出现伪造
使用简单
采用
Client/Server
架构实现 面向对象的调用方式,即在使用
Binder
时就和调用一个本地对象实例一样
6. 总结
本文主要详细讲解 跨进程通信模型
Binder
机制 ,总结如下:
定义
看完上述内容,你们掌握Android中怎么利用Binder实现跨进程通信的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读!
新闻标题:Android中怎么利用Binder实现跨进程通信
标题路径:http://pwwzsj.com/article/ishdoi.html