本文原创作者:Cloud Chou. 欢迎转载,请注明出处和本文链接

从前面的博客中我们已经学习到如何使用binder,也学习到binder的框架及原理。今天就聊聊我对android为什么使用binder作为最重要的IPC机制这个问题的想法,并总结一下先前的android binder相关博客。

binder其实不是android首先提出来的IPC机制,它是基于OpenBinder来实现的。OpenBinder有许可问题,andriod不能直接使用,故此重新开发了自己的一套binder实现,基于宽松的Apache协议发布,架构与OpenBinder类似,相关信息可以参考: http://www.open-binder.org。

Android为什么选用Binder作为最重要的IPC机制

我们知道在Linux系统中,进程间的通信方式有socket,named pipe,message queue,signal,sharememory等。这几种通信方式的优缺点如下:

  • 1) named pipe: 任何进程都能通讯,但速度慢
  • 2) message queue: 容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
  • 3) signal: 不能传递复杂消息,只能用来同步
  • 4) shared memory: 能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存同样可以作为线程通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存。
  • 5) socket:本机进程之间可以利用socket通信,跨主机之间也可利用socket通信,通常rpc的实现最底层都是通过socket通信。socket通信是一种比较复杂的通信方式,通常客户端需要开启单独的监听线程来接收从服务端发送过来的数据,客户端线程发送数据给服务端后,如果需要等待服务端的响应,并通过监听线程接收数据,需要进行同步,是一件很麻烦的事情。通过socket通信速度也不快。Android中属性服务的实现和vold服务的实现采用了socket,getprop和setprop等命令都是通过socket和init进程通信来获得属性或者设置属性,vdc命令或者mount service也是通过socket和vold服务通信来操作外接设备,比如sd卡。

message queue允许任意进程通过共享消息队列来实现进程间通信,并由系统调用函数来实现消息发送和接收之间的同步,从而使得用户在使用消息缓冲进行通信时不再需要考虑同步问题。使用方便,但是信息的复制需要额外消耗CPU的时间,不适宜于信息量大或者操作频繁的场合。共享内存针对消息缓冲的缺点改而利用内存缓冲区直接交换信息,无须复制,快速,信息量大是其优点。但是共享内存的通信方式是通过将共享的缓冲区直接加到进程的虚拟地址空间中来实现的。因此这些进程之间的读写操作的同步问题操作系统无法实现。必须由进程利用其它同步工具解决。另外由于内存实体存在于计算机系统中,所以只能由处于同一个计算机系统的进程共享。不方便网络通信。

共享内存块提供了在任意数量的进程之间进行高效双向通信的机制,每个使用者都可以读取写入数据,但是所有程序之间必须达成并遵守一定的协议,以防止诸如在读取信息之前覆盖内存空间等竞争状态的实现。不幸的是,Linux无法严格保证对内存块的独占访问,甚至是您通过使用IPC_PRIVATE创建新的共享内存块的时候,也不能保证访问的独占性。同时,多个使用共享内存块的进程之间必须协调使用同一个键值。

Android应用程序开发者开发应用程序时,对系统框架的进程和线程运作机制不必了解,只需要利用四大组件开发,Android应用开发时可以轻易调用别的软件提供的功能,甚至可以调用系统App,在Android的世界里,所有应用生而平等,但实质上应用进程被隔离在不同的沙盒里。

Android平台的进程之间需要频繁的通信,比如打开一个应用便需要Home应用程序进程和运行在system_server进程里的AcitivityManagerService通信才能打开。正是由于Android平台的进程需要非常频繁的通信,故此对进程间通信机制要求比较高,速度要快,还要能进行复杂数据的交换,应用开发时应尽可能简单,并能提供同步调用。虽然共享内存的效率高,但是它需要复杂的同步机制,使用时很麻烦,故此不能采用。binder能满足这些要求,所以Android选择了binder作为最核心的进程间通信方式。binder主要提供以下一些功能:

  • 1) 用驱动程序来推进进程间的通信方式
  • 2) 通过共享内存来提高性能
  • 3) 为进程请求分配每个进程的线程池,每个应用进程默认启动两个binder服务线程
  • 4) 针对系统中的对象引入了引用技术和跨进程的对象引用映射
  • 5) 进程间同步调用。

Binder入门和详解系列博客汇总

《service manager和binder service的关系》

http://www.cloudchou.com/android/post-327.html

阐述了servicemanager和binder service的关系,并说明了servicemananger,binder service的服务端,客户端程序运行时各自所在进程

《Binder service入门–创建native binder service》

http://www.cloudchou.com/android/post-332.html

用实例说明如何创建native binder service的服务端和客户端,并说明了如何编译以及运行程序,代码在github上可下载。

《Binder service入门—Framework binder service》

http://www.cloudchou.com/android/post-447.html

用实例说明如何创建framework层 binder service的服务端和客户端,并说明了如何编译以及运行程序,代码在github上可下载

《Binder service入门—应用层binder service》

http://www.cloudchou.com/android/post-458.html

用实例说明如何创建应用层binder service的服务端和客户端,并说明了如何编译以及运行程序,代码在github上可下载

《Binder service入门—框架层、应用层调用native binder service》

http://www.cloudchou.com/android/post-468.html

综合运用了前面几篇博客的知识,用实例说明了如何在框架层,应用层调用native binder service,所有代码均可在github上下载

《Binder 机制详解—Binder IPC 程序结构》

http://www.cloudchou.com/android/post-497.html

从本篇博客开始分析binder机制,简单介绍了binder机制运行时服务端,客户端和servicemananger的关系

《Binder 机制详解—Binder 系统架构》

http://www.cloudchou.com/android/post-507.html

分析了Binder系统架构,层次划分,并着重分析了Binder Adaper层和Binder的核心部分

《本地Binder框架通信原理》

http://www.cloudchou.com/android/post-534.html

分析了binder本地框架通信原理,主要就两个重要函数调用流程进行分析,分析了如何获得servicemananger的IBinder指针,还分析了客户端如何获得IBinder指针

《Binder 机制详解—Binder 本地框架》

http://www.cloudchou.com/android/post-547.html

分析了Binder本地框架各个类之间的关系,以及IServiceManager相关类之间的关系

《Binder 机制详解—Binder Java框架》

http://www.cloudchou.com/android/post-558.html

分析了Binder Java框架各个类之间的关系,并分析了Binder java框架的相关Jni源码,给出了Java层Binder,BinderProxy,Parcel和本地的BnBinder,BpBinder,Parcel之间的关系。

《Java层Binder框架通信原理》

http://www.cloudchou.com/android/post-573.html

分析了Java层Binder框架通信原理,主要分析了Java层如何获得IServiceManager对象,和Java层如何获得IBinder接口对象,还分析了Java层binder的数据流动

参考资料

《Android技术内幕—系统卷》 第3章 Android的IPC机制—Binder

Android Binder总结(转自Cloud Chou's Tech Blog)相关推荐

  1. Android Binder总结

    本文原创作者:Cloud Chou.欢迎转载,请注明出处和本文链接 从前面的博客中我们已经学习到如何使用binder,也学习到binder的框架及原理.今天就聊聊我对android为什么使用binde ...

  2. Android Binder IPC机制

    之前有很多人问过我TaintDroid的内容,所以一点点吧涉及的思路整理一下. 今天又看了一遍,确实需要很多的技术支持以及扎实的功底,不管是Java的还是Android,从系统底层一直到顶层,涉及的知 ...

  3. Android Binder 学习笔记

    前言: Binder是Android给我们提供的一种跨进程通信方式.理解Binder能帮助我们更好的理解Android的系统设计,比如说四大组件,AMS,WMS等系统服务的底层通信机制就都是基于Bin ...

  4. aidl使用_借助 AIDL 理解 Android Binder 机制——Binder 来龙去脉

    AIDL 是 Android Interface Definition Language(Android 接口定义语言)的缩写,它是 Android 进程间通信的接口语言.由于 Android 系统的 ...

  5. Android Binder Driver缺陷导致定屏问题分析

    本文讲解异步Android binder call是如何阻塞整个系统的,通过ramdump信息以及binder通信协议来演绎并还原定屏现场. 一.背景知识点 解决此问题所涉及到的基础知识点有:Trac ...

  6. 理解Android Binder机制(3/3):Java层

    本文是Android Binder机制解析的第三篇,也是最后一篇文章.本文会讲解Binder Framework Java部分的逻辑. Binder机制分析的前面两篇文章,请移步这里: 理解Andro ...

  7. 理解Android Binder机制(1/3):驱动篇

    Binder的实现是比较复杂的,想要完全弄明白是怎么一回事,并不是一件容易的事情. 这里面牵涉到好几个层次,每一层都有一些模块和机制需要理解.这部分内容预计会分为三篇文章来讲解.本文是第一篇,首先会对 ...

  8. Android Binder机制(1501210451 张志康)

    本文主要分析native层和Java层的Android binder通信机制. binder是Android最为常见的进程通信机制之一,其驱动和通信库是binder的核心,分别由C和C++编写,应用程 ...

  9. Android Binder设计与实现 - 实现篇(1)

    本文属于原创作品,转载请注明出处并放于明显位置,原文地址:http://www.cnblogs.com/albert1017/p/3849585.html 前言 在学习Android的Binder机制 ...

  10. Android Binder 分析——匿名共享内存(Ashmem)

    前面分析了 binder 中用来打包.传递数据的 Parcel,一般用来传递 IPC 中的小型参数和返回值.binder 目前每个进程 mmap 接收数据的内存是 1M,所以就算你不考虑效率问题用 P ...

最新文章

  1. 【每日一算法】搜索插入位置
  2. PNAS “深度学习的科学”论文合集导读
  3. java类定义的顺序_Java类及对象的初始化顺序
  4. Deepin15.7 Android8.1 编译 以及问题解决
  5. C# string类型和byte[]类型相互转换
  6. 5年,我从文员一路晋升到总监,薪资翻了5倍[转]
  7. CentOs 中显示乱码问题
  8. 蓝天采集器自动化采集发布
  9. Django账号绑定邮箱时发送链接
  10. UpdatePannelFileUpload
  11. RJ-45接口信号定义
  12. Installshield停止操作系统进程的代码 --IS6及以上版本适用
  13. 蔚蓝网上书店项目js/jQuery部分
  14. axure rp 8.1.0.3379 密钥license,Axure8.1中文破解版 8.1.0.3379 含授权码
  15. Open Robotics 十周年(2012-2022)
  16. pdf转换成word后有文字叠加_将PDF转换成Word文档后,为什么字体全变了?
  17. Excel教程视频《Excel大神上分攻略》50个工作场景,从案例到实践
  18. Minecraft整合包 [GTNH]格雷科技:新视野 服务器搭建教程
  19. 存储空间不足,无法处理此命令。 (异常来自 HRESULT:0x80070008)
  20. QT 无边窗口圆角实现

热门文章

  1. 安装selenium时报错,Unable to create process using ‘D:\ProgramData\python.exe D:\ProgramData\Scripts\pip-s
  2. 如何搭建Hadoop分布式环境?我来教你怎么做![内含测试小案例]
  3. python tokenize()_tokenize (Language) – Python 中文开发手册 - Break易站
  4. 142Echarts - 矩形树图(Disk Usage)
  5. syswow64删除文件_Win7系统电脑中的Syswow64是什么文件夹?能不能删除?
  6. java 时间段求并集_java多个时间段 互相有交集求并集的问题
  7. 谷歌浏览器好用的复制粘贴插件_关于谷歌浏览器(chrome)的一些好用的插件推荐...
  8. 色彩构成与搭配——人对色彩的感觉
  9. 史上超级详细:银行外包java面试题目
  10. Android自定义导览地图组件(二)