`

详细说说Binder通信原理与机制

阅读更多

先上一张Binder 的工作流程图。(如果不清晰,可以 复制图片链接到浏览器 或 保存到本地 查看,我经常都是这样看图的哈)

更多Android高级面试合集放在github上面了(更多面试文档,项目下载,源码)
https://github.com/xiangjiana/androids
需要更多项目下载,源码的小伙伴可以点击关于我 联系我获取

一开始上手,陌生的东西比较多,But,其实并不复杂。喔,流程图是用 ProcessOn 画的。很棒的在线画图工具。

出发前预备子弹 我们知道进程之间,虚拟地址不同,是不能直接通信的,这是一种保护机制。打开任务管理器,查看一下N多的进程,试想一下如果这些进程直接通信会带来什么后果?

而用户空间可以通过System calls(系统回调)与内核空间通信的,如果在内核空间中有一个模块,能够完成数据的转发,那么是不是两个进程就可以通信了呢?如下图:

 

image
image

 

上面提到一些用户空间、内核空间的概念,用户空间也能大概猜到是什么东西,而内核空间,就知道它是很底层的东西好了。而模块呢,可以简单的理解为实现一个功能的程序或一个硬件电路等,比如玩单片机的时候,会有红外线模块,蓝牙模块,wifi模块等。这些概念的东西搜索一下百科知道就好。

Binder驱动

Binder驱动运行在内核空间,它就是那个内核模块了。Binder驱动很重要,承担了进程间通信的数据转发等。一提到驱动,也是比较熟悉,你插个U盘,需要驱动吧。而Binder驱动也差不多,虽然名字取得很好,功能还很强大。但也不是什么神奇的东西。

Binder跨进程通信模型

Binder的通信模型有4个角色:Binder Client、Binder Server、Binder Driver(Binder驱动)、ServiceManager。

想象一个情景:我到北京旅行,要给高中同学寄一张明信片,明信片肯定要写上地址吧,不然怎么寄给对方呢?那么我怎么拿到这个地址呢,很简单,翻一下毕业相册就好了。而这个记录着同学们通信地址的毕业相册,就相当与一个通讯录。在Binder的通信模型中扮演的是ServiceManager的角色。好,现在已经有了通信地址了,那么就找到邮局寄出去就好了。过几天同学就高高兴兴的收到了明信片。那么这个邮局在Binder通信模型中扮演的是Binder驱动的角色,而作为寄信人的我就是Binder Client,收信人同学就是Binder Server。

先上一张图来描述上面的那个情景:

可以看到,ServiceManager、Binder Client、Binder Server处于不同的进程,他们三个都在用户空间,而Binder驱动在内核空间。(我是特意把Binder驱动画的比较大的,因为Binder驱动的作用最大)

那先来简述一下这个通信模型:

首先是有一个ServiceManager,刚开始这个通讯录是空白的,然后Server进程向ServiceManager注册一个映射关系表,比如雷同学把自己的地址湖南省长沙市xx区写进通讯录,那么就形成了一张表:

雷同学 —> 湖南省长沙市xx区

之后Client进程想要和Server进程通信,首先向ServiceManager查询地址,ServiceManager收到查询的请求之后,返回查询结果给Client。

注意到这里不管是Server进程注册,还是Client查询,都是经过Binder驱动的,这也真是Binder驱动的作用所在,先不急,下面的原理会分析到。

这时候我就拿着地址就开始寄明信片咯。当我把明信片放扔进邮筒,之后的工作就是由邮局去完成了,也就是Binder驱动去完成通信的转发。

Binder通信原理

从寄明信片的例子中,邮递员从邮筒取出明信片,然后跨越千山万水将明信片送达。从这点我们也能想到,其实Binder驱动完成的工作是很重要的。

我们来还原一个Binder跨进程通信的过程。 案例:Client进程调用Server进程的computer对象的add方法。

接下来的内容你可能需要知道代理模式才能更好的理解,不过没学习过代理模式也没关系,可以先读下去,然后在去补一下代理模式,再回来看这篇文章。思路会清晰很多。

1. Server进程向ServiceManager注册,告诉ServiceManager我是谁,我有什么,我能做什么。就好比徐同学(Server进程)有一台笔记本(computer对象),这台笔记本有个add方法。这时映射关系表就生成了。

2. Client进程向ServiceManager查询,我要调用Server进程的computer对象的add方法,可以看到这个过程经过Binder驱动,这时候Binder驱动就开始发挥他的作用了。当向ServiceManager查询完毕,是返回一个computer对象给Client进程吗?其实不然,Binder驱动将computer对象转换成了computerProxy对象,并转发给了Client进程,因此,Client进程拿到的并不是真实的computer对象,而是一个代理对象,即computerProxy对象。很容易理解这个computerProxy对象也是有add方法,(如果连add方法都没有,岂不是欺骗了Client?),但是这个add方法只是对参数进行一些包装而已。

3. 当Client进程调用add方法,这个消息发送给Binder驱动,这时驱动发现,原来是computerProxy,那么Client进程应该是需要调用computer对象的add方法的,这时驱动通知Server进程,调用你的computer对象的add方法,将结果给我。然后Server进程就将计算结果发送给驱动,驱动再转发给Client进程,这时Client进程还蒙在了鼓里,他以为自己调用的是真实的computer对象的add方法,其实他只是调用了代理而已。不过Client最终还是拿到了计算结果。

好了,一个通信过程就完成了。我们发现,其实Binder驱动就是一个中转。

总结

再来梳理总结一下:当Client进程向ServiceManager查询Server进程(我要调用你的某个对象的某个方法了),这个过程也是一个跨进程通信的过程,也经过了Binder驱动,这时Binder驱动发挥它的作用,来了个狸猫换太子,将Server进程中的真实对象转换成代理对象,返回这个代理对象给Client进程。 Client进程拿到了这个代理对象,然后调用这个代理对象的方法,Binder驱动继续发挥他的使命,它会通知Server进程执行计算工作,将Server进程中的真实对象执行的结果返回给了Client进程,这样Client进程还是如愿的得到了自己想要。跨进程通信完毕

关于我

更多Android高级面试合集放在github上面了

需要的小伙伴可以点击关于我 联系我获取

非常希望和大家一起交流 , 共同进步

也可以扫一扫, 目前是一名程序员,不仅分享 Android开发相关知识,同时还分享技术人成长历程,包括个人总结,职场经验,面试经验等,希望能让你少走一点弯路。

分享到:
评论

相关推荐

    模拟binder通信的demo

    模拟binder通信的demo模拟binder通信的demo模拟binder通信的demo模拟binder通信的demo模拟binder通信的demo模拟binder通信的demo模拟binder通信的demo模拟binder通信的demo模拟binder通信的demo模拟binder通信的demo...

    android通信机制binder实例

    在Android系统中,Binder是实现进程间通信(IPC,Inter-Process Communication)的关键技术,它是一种轻量级的通信机制,使得应用程序之间可以共享服务和数据。本篇将通过一个学习实例来深入理解Android Binder的...

    Binder机制原理解析

    Binder机制是Android系统的核心组成部分,它是实现Android应用跨进程通信(IPC)的关键技术。相比于其他IPC方式,如Socket、Shared Memory、Signal,Binder在效率和内存管理方面具有显著优势,因为它只需要一次数据...

    C++binder通信实例

    C++ Binder通信是Android系统中进程间通信(IPC)的核心技术,它允许不同进程之间高效地交换数据和调用服务。在这个实例中,我们将探讨如何使用C++来实现Binder客户端和服务端。 首先,理解Binder机制的基本概念至...

    Android Binder 实现原理

    很详细讲解了Binder实现原理,细节,设计思想

    Android Binder通信案例

    在Android系统中,Binder是实现进程间通信(IPC, Inter-Process Communication)的关键机制,它允许不同进程间的对象互相调用方法,实现了跨进程的数据交换和服务交互。本篇将深入探讨如何利用Android Interface ...

    MediaPlayerService Binder机制源码分析及详解

    本文将深入解析`MediaPlayerService`的创建过程以及Binder机制的实现原理。 首先,`MediaPlayerService`的诞生始于`MediaServer`进程的启动。在`Main_mediaserver.cpp`的`main`函数中,一系列服务被实例化,包括`...

    android native层 binder通信机制演示源码

    在Android系统中,Binder是实现进程间通信(IPC,Inter-Process Communication)的主要机制,尤其在涉及服务(Service)和应用程序组件之间的交互时。在Android的Native层进行Binder通信,可以提升性能并降低内存...

    进程内Activity和service使用Binder通信代码备份

    然而,当涉及到Service在后台运行或者需要与其他应用共享数据时,Binder机制就显得尤为重要。 Binder通信的基础是AIDL(Android Interface Definition Language),它允许开发者定义接口,使得不同进程的对象可以...

    Android进程间通信-Binder机制详解

    Android 进程间通信-Binder 机制详解 Android 系统中,每一个应用程序都是由一些 Activity 和 Service 组成的,一般 Service 运行在独立的进程中,而不同的 Activity 有可能运行在同一个进程中,也可能运行在不同的...

    Android Binder Aidl原理.pdf

    Android Binder的AIDL(Android Interface Definition Language)原理是指Binder机制中使用AIDL语言来定义接口的原理。AIDL是一种IDL(Interface Definition Language),用于定义Binder接口的结构和行为。通过使用...

    Android利用Binder进行通信DEMO

    在Android系统中,Binder是实现进程间通信(IPC,Inter-Process Communication)的主要机制,它是一种轻量级的通信方式,允许不同进程间的对象互相调用方法,从而实现数据交换和功能调用。本示例"Android利用Binder...

    Binder与进程间通信

    ### Binder与进程间通信 #### 一、Binder机制概述 Binder机制是Android系统中实现进程间通信(Inter-...通过深入分析Binder与进程间通信的具体实现细节,我们可以更好地理解和运用这一机制来解决实际开发中的问题。

    Android进程间通信(IPC)机制Binder简要介绍和学习计划

    Android进程间通信(IPC)机制Binder简要介绍和学习计划

    Android Binder机制

    - **Binder原理**:Binder机制基于C/S架构,服务端(Server)在自己的进程中提供服务,客户端(Client)通过Binder接口请求服务。Binder在用户空间和内核空间之间传递数据,实现进程间的通信。 - **三角色模型**:...

    Android直接通过binder节点通信

    本篇文章将详细探讨“Android直接通过binder节点通信”的概念、原理以及实践。 首先,理解Binder通信的基础。在Android中,每个应用程序运行在自己的进程中,而Binder提供了跨越进程界限的通信方式。Binder通信涉及...

Global site tag (gtag.js) - Google Analytics