Android Binder机制

参考感谢https://www.jianshu.com/p/4ee3fd07da14

一、什么是 Binder

  1. 从模型、机制的角度讲:
    BIndier 是Android 中跨进程通信的一种方式。
  2. 从模型的结构、组成来说
    BIndier 是一种虚拟的物理设备驱动。连接 server 进程、client 进程、与 ServiceManager 进程。
  3. 从 Android 的代码角度实现来说
    BIndier 是一个 类 继承了 IBinder 接口,是 BIndier 机制模型的 代码实现。

二、Linux 进程模型

1、模型

进程模型
  1. 每个进程分为 用户控件与内核空间,二者是隔离的,二者之间数据传递要通过系统的 copy_from_user()与 copy_to_user()拷贝数据。
  2. 不同进程之间用户控件的数据是不可共享的,而内核空间的数据是所有进程共享的。
  3. android中为了保证安全性与独立性,一个进程不能操作或访问另一个进程。即进程间是相互独立的、隔离的。

2、 传统的进程间通信

由上信息,可想到传统的进程通信原理:

可通过copy_from_user()与 copy_to_user()以内核空间作为中介 进行数据传递。

但缺点显而易见:

  • 数据需要两次拷贝,效率低下
  • 接收方进程不知道发来的数据需要多大空间,所以要么开辟尽量大的内存,要么先行传递数据空间大小信息,前者浪费空间,后者浪费时间。

而 通过Binder机制进行 进程间通信,数据只需一次拷贝,同时负责创建接收区缓存空间,与管理接收方缓存的工作。

三、Binder 原理

1、Binder 进程间通信模型

采用 Client — Server 模型。


Binder C/S模型

角色介绍:
1、 Client 进程 ,使用服务的进程。
2、server 进程, 提供服务的进程。
3、 ServerManager, 提供server 进程 Binder 实体的注册,建立该 Binder 的引用,再将字符串形式的 Binder 名字与 Binder 引用维护到一张表中。client 进程则可以通过 所需服务Binder的字符串名字 查询到 Binder 的引用,进而进行进程间通信。
4、 binder 驱动,一种虚拟的物理设备,是 client 、server、与 serviceManager 的桥梁。作用:

  • 传递服务进程消息
  • 建立内存映射(此处即为 Binder 进行IPC数据只需一次拷贝的秘密)
  • 实现线程控制

2、通信的具体步骤

  1. server注册服务
    1. sever 进程想 Binder驱动 发起注册服务请求。
    2. Bindier 驱动 向 ServiceManager 转发请求。
    3. ServiceManager 收到请求,注册该服务。
  2. client获取服务
    1. client进程 向 Binder 驱动发起获取服务请求。传递字符串服务名。
    2. Binder 驱动 转发请求给 ServiceManager
    3. ServiceManager 查找到对应的服务信息 通过 Binder 驱动将服务信息转发给 client。

至此client 进程与 server 进程已经建立了连接。

  1. 调用服务
    1. Binder驱动为通信做准备
      。创建一块接收缓冲区
      。通过 ServiceManager 查到 Server 信息,调用系统的 mmap()函数建立 server进程的
      用户空间——内核空间——接收缓冲区 映射关系。

    2. client 进程将参赛数据发送到 server 进程
      。client 进程通过copy_from_user()函数 像内核空间写入数据,并挂起当前线程。
      由于存在映射关系,故相当于数据已经发送到了server 进程的 用户空间。
      。Binder 驱动通知 server 进程执行解包

    3. server 进程根据 client 的请求 调用目标方法。
      。收到 Binder 驱动的通知后 从线程池取出线程,并执行解包、调用目标方法操作
      。将执行结果写入自己共享内存中。

    4. 将结果返回给 client
      。server 将最终执行结果写入存在映射的用户空间中,由于内存映射关系,想当于 结果传递给了client
      。Binder 驱动 通知 client 接收结果,唤醒 client 挂起的线程
      。client 通过copy_to_user()将数据拷贝至自己的进程的用户空间。


      示意图

至此通信结束

优点:

每次单向通信只需一次内存拷贝,传输效率高。
为接收进程分配了不确定大小的接受缓冲区

三、一些疑问点

1、为什么 Client 进程、Server 进程、ServiceManager 进程之间的交互都必须通过 Binder 驱动?

参照上文中 Linux 进程模型

  1. Client进程、Server进程 & Service Manager进程属于进程空间的用户空间,不可进行进程间交互。
  2. Binder驱动 属于 进程空间的 内核空间,可进行进程间 & 进程内交互。
2、ServiceManager是参与 BInder 机制的,但是为什么与ServiceManager 进程通信也是用的 Binder 机制?

Binder驱动 & Service Manager进程 属于 Android基础架构(即系统已经实现好了);而Client 进程 和 Server 进程 属于Android应用层(需要开发者自己实现)

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

推荐阅读更多精彩内容