Android进程间通信:Binder机制

写在最前端

在Android系统中,每一个app都是运行在一个独立的进程中的,不同进程之间是相互隔离、相互独立的,Android系统如此设计的目的是保障app的安全性和独立性。试想如果你开发的app程序在运行的过程中,可以被其他任意app调用和访问,这是多么可怕的事情。但是时代发展的规律告诉我们,有交流才会有进步,相互合作才会共赢。Android也顺应这种时代发展规律,所以为用户提供了一套进程间通信的机制(IPC)——Binder机制。

Binder机制本身比较强大,其中的Binder驱动等都是在Linux内核中,如果通过分析源码的方式,很多不熟悉C/C++的人可能会感到非常困难,本次只宏观分析,宗旨是让大家对Binder机制有一个宏观上的理解,重点是理解和吸收这种设计的思想。

注意:本文中没有结合源码进行分析,有需要看源码的请绕过~~

转发请标明出处:https://blog.csdn.net/Dream_201603/article/details/85260739

Binder通信机制原理

1 进程通信途径

首先要知道,进程空间分两部分,一部分运行在Linux的内核空间,另一部分运行在用户空间。Android系统中所有进程共用一个内核空间,不同进程的内核空间可以共享数据,但是不同进程的用户空间不可以共享数据。进程内,用户空间可以通过“系统调用”来访问内核空间。内核空间内,可以通过Binde驱动进行数据的传输。所以进程之间要进行通信,必须通过如下图所示的模拟途径:

image

2 Binder通信机制(Client-Server模型)

现在对跨进程间通信的路径有了一个宏观上的认知,下面将介绍Binder通信机制中的Client-Server模型。当前模拟一下两个进程之间的通信:假设其中一个进程提供一种加密数据的服务,另一个进程想要通过该服务将自己的数据进行加密。现在我们称提供加密服务的进程为Server进程(服务端),要使用服务的进程称为Client进程(客户端)。

  • Server进程:提供服务的进程,类似于服务器
  • Client进程:要使用服务的进程,类似于客户端

在Android中,进程在用户空间是不能进行消息传输的,在内核空间中是通过Binder驱动进行传递消息的,任意一个进程都可以提供服务的,提供服务的进程只需要将自己的信息告知Binder驱动,Binder驱动就会将提供服务的进程信息保存在ServerManager进程中,ServerManager进程是用来管理Server进程的注册与查询的。当有Client进程要使用这个Server进程的服务时,Client进程首先向Binder驱动提出要使用这个Server进程,Binder驱动会通过ServerManager进程获取该Server进程的信息并返回该Clinet进程,Client进程通过这些信息与Server进程进行连接,之后通过Binder驱动就可以进行消息的传输了。

  • ServerManager进程:用来管理Server进程的注册与查询,类似于路由器
  • Binder驱动:连接Server进程、Client进程和ServerManager进程的桥梁,类似于网线

上述步骤的模拟图如下:

image

进程通信的整体使用步骤说明:

  • (1)注册服务
  • ①Server进程向Binder驱动发起注册服务的请求。
  • ②Binder驱动将注册请求传递给ServerManager进程。
  • ServerManager进程记录该服务的信息。

至此,服务注册成功。

  • (2) 建立连接
  • ③Client进程向Binder驱动发起获取指定服务的请求,并携带要获取的服务名称
  • ④Binder驱动将请求传递给ServerManager进程
  • ServerManager进程根据服务名称查找Client进程需要的Server进程对应的信息
  • ⑤ServerManager进程将对应的信息传发送给Binder驱动
  • ⑥Binder驱动将对应的信息传递给Clinet进程

至此,Client进程与Server进程之间建立连接。

  • (3) 使用服务
  • ⑦Client进程发送要处理的数据
  • Binder驱动将Client进程发送的数据传递给Server进程
  • ⑧Server进程获取到Client进程发送过来的数据

至此,数据传输完成。

3 Client-Server模型中数据传递的详细介绍

image

如上图所示,详细介绍了当Client进程与Server进程之间建立好连接后,通过Binder驱动为媒介进行数据传输的详细过程。整体分为三个步骤:

  • (1)Client进程发送数据:①②③④⑤
  • (2)执行对应的服务功能:
  • (3)Server进程返回执行的结果:⑦⑧⑨⑩

因为上图已经将步骤的具体操作说明写上了,标注的都非常详细,此处就不再展开详细复述。

4 Android开发者在开发中需要实现的点

上面已将全面的介绍了Android进程间通信的Binder机制:Client-Server模型。模型设计中的好多思想是值得我们学习和深思的,但是Binder机制涉及的知识这么多,好多人似乎都被它吓到了。其实不然,既然作为Android中进程间通信的方式,这些其实都是Android为我们实现好的,在开发中我们只需要知道如何使用就行了。下面我们就了解一下哪些是Android已经帮我们实现好的,哪些是需要我们开发者实现的。

其实在Android系统中,Binder驱动和ServerManager进程都是Android已经帮我们实现好了的,Client进程和Server进程是我们需要自己实现的。这也好理解,就在赘述了。如下图所示:

image

综上:

  • Binder驱动和ServerManager进程是Android系统已经实现好的
  • Client进程和Server进程是需要开发者自己实现的

5 补充说明的点:Binder请求的线程管理

以上就将Binder机制基本介绍完全,有些细节上的点需要补充一下,主要补充的是Binder请求时的线程管理。为什么要引入线程管理,其实很好理解,因为Server进程是给Client进程提供服务的,也就是说Server进程只提供服务,而Client进程只是使用。那就会出现多个Client进程使用同一个Server进程,为了并发操作,所以Server进程会创建额很多线程来处理Binder请求。多线程操作自然就引出了线程池的概念,而在Binder机制中,管理Binder模型的线程是采用的Binder驱动的线程池,并由Binder驱动管理该线程池。一个进程的Binder线程数默认最大是16,超过之后不会再创建新的线程,而是会阻塞等待空闲的Binder线程。

总结

Android中通过Binder机制进行进程间通信是非常普遍的,常用的有:内容提供者、AIDL等。到此,基本将Android进程间通信的Binder机制讲述完成,有想更深入了解的可以通过Android源码来详细品味。编写仓促,有问题点欢迎指正。

-----------------分----------------割---------------线-------------------

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容