在Android系统中,每一个应用程序都是由一些Activity和Service组成的,这些Activity和Service有可能运行在同一个进程中,也有可能运行在不同的进程中。那么,不在同一个进程的Activity或者Service是如何通信的呢?这就是本文中要介绍的Binder进程间通信机制了。

我们知道,Android系统是基于Linux内核的,而Linux内核继承和兼容了丰富的Unix系统进程间通信(IPC)机制。有传统的管道(Pipe)、信号(Signal)和跟踪(Trace),这三项通信手段只能用于父进程与子进程之间,或者兄弟进程之间;后来又增加了命令管道(Named Pipe),使得进程间通信不再局限于父子进程或者兄弟进程之间;为了更好地支持商业应用中的事务处理,在AT&T的Unix系统V中,又增加了三种称为“System V IPC”的进程间通信机制,分别是报文队列(Message)、共享内存(Share Memory)和信号量(Semaphore);后来BSD Unix对“System V IPC”机制进行了重要的扩充,提供了一种称为插口(Socket)的进程间通信机制。若想进一步详细了解这些进程间通信机制,建议参考Android学习启动篇一文中提到《Linux内核源代码情景分析》一书。

但是,Android系统没有采用上述提到的各种进程间通信机制,而是采用Binder机制,难道是因为考虑到了移动设备硬件性能较差、内存较低的特点?不得而知。Binder其实也不是Android提出来的一套新的进程间通信机制,它是基于OpenBinder来实现的。OpenBinder最先是由Be Inc.开发的,接着Palm Inc.也跟着使用。现在OpenBinder的作者Dianne Hackborn就是在Google工作,负责Android平台的开发工作。

前面一再提到,Binder是一种进程间通信机制,它是一种类似于COM和CORBA分布式组件架构,通俗一点,其实是提供远程过程调用(RPC)功能。从英文字面上意思看,Binder具有粘结剂的意思,那么它把什么东西粘结在一起呢?在Android系统的Binder机制中,由一系统组件组成,分别是Client、Server、Service Manager和Binder驱动程序,其中Client、Server和Service Manager运行在用户空间,Binder驱动程序运行内核空间。Binder就是一种把这四个组件粘合在一起的粘结剂了,其中,核心组件便是Binder驱动程序了,Service Manager提供了辅助管理的功能,Client和Server正是在Binder驱动和Service Manager提供的基础设施上,进行Client-Server之间的通信。Service Manager和Binder驱动已经在Android平台中实现好,开发者只要按照规范实现自己的Client和Server组件就可以了。说起来简单,做起难,对初学者来说,Android系统的Binder机制是最难理解的了,而Binder机制无论从系统开发还是应用开发的角度来看,都是Android系统中最重要的组成,因此,很有必要深入了解Binder的工作方式。要深入了解Binder的工作方式,最好的方式莫过于是阅读Binder相关的源代码了,Linux的鼻祖Linus Torvalds曾经曰过一句名言RTFSC:Read The Fucking Source Code。

虽说阅读Binder的源代码是学习Binder机制的最好的方式,但是也绝不能打无准备之仗,因为Binder的相关源代码是比较枯燥无味而且比较难以理解的,如果能够辅予一些理论知识,那就更好了。闲话少说,网上关于Binder机制的资料还是不少的,这里就不想再详细写一遍了,强烈推荐下面两篇文章:

Android深入浅出之Binder机制

Android Binder设计与实现 – 设计篇

Android深入浅出之Binder机制一文从情景出发,深入地介绍了Binder在用户空间的三个组件Client、Server和Service Manager的相互关系,Android Binder设计与实现一文则是详细地介绍了内核空间的Binder驱动程序的数据结构和设计原理。非常感谢这两位作者给我们带来这么好的Binder学习资料。总结一下,Android系统Binder机制中的四个组件Client、Server、Service Manager和Binder驱动程序的关系如下图所示:

1. Client、Server和Service Manager实现在用户空间中,Binder驱动程序实现在内核空间中

2. Binder驱动程序和Service Manager在Android平台中已经实现,开发者只需要在用户空间实现自己的Client和Server

3. Binder驱动程序提供设备文件/dev/binder与用户空间交互,Client、Server和Service Manager通过open和ioctl文件操作函数与Binder驱动程序进行通信

4. Client和Server之间的进程间通信通过Binder驱动程序间接实现

5. Service Manager是一个守护进程,用来管理Server,并向Client提供查询Server接口的能力

至此,对Binder机制总算是有了一个感性的认识,但仍然感到不能很好地从上到下贯穿整个IPC通信过程,于是,打算通过下面四个情景来分析Binder源代码,以进一步理解Binder机制:

1. Service Manager是如何成为一个守护进程的?即Service Manager是如何告知Binder驱动程序它是Binder机制的上下文管理者。

2. Server和Client是如何获得Service Manager接口的?即defaultServiceManager接口是如何实现的。

3. Server是如何把自己的服务启动起来的?Service Manager在Server启动的过程中是如何为Server提供服务的?即IServiceManager::addService接口是如何实现的。

4  Service Manager是如何为Client提供服务的?即IServiceManager::getService接口是如何实现的。

在接下来的四篇文章中,将按照这四个情景来分析Binder源代码,都将会涉及到用户空间到内核空间的Binder相关源代码。这里为什么没有Client和Server是如何进行进程间通信的情景呢? 这是因为Service Manager在作为守护进程的同时,它也充当Server角色。因此,只要我们能够理解第三和第四个情景,也就理解了Binder机制中Client和Server是如何通过Binder驱动程序进行进程间通信的了。

为了方便描述Android系统进程间通信Binder机制的原理和实现,在接下来的四篇文章中,我们都是基于C/C++语言来介绍Binder机制的实现的,但是,我们在Android系统开发应用程序时,都是基于Java语言的,因此,我们会在最后一篇文章中,详细介绍Android系统进程间通信Binder机制在应用程序框架层的Java接口实现:

5. Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析。

老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注!

183
9
  • 上一篇Android日志系统Logcat源代码简要分析
  • 下一篇浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路

我的同类文章

Android(175)
  • •Chromium扩展(Extension)的页面(Page)加载过程分析2016-09-19阅读967
  • •Chromium扩展(Extension)机制简要介绍和学习计划2016-09-05阅读14606
  • •Chromium为视频标签<video>渲染视频画面的过程分析2016-08-22阅读2328
  • •Chromium视频标签<video>简要介绍和学习计划2016-08-08阅读2510
  • •Chromium网页滑动和捏合手势处理过程分析2016-07-11阅读5373
  • •Chromium网页输入事件处理机制简要介绍和学习计划2016-06-27阅读5352
  • •Chromium扩展(Extension)加载过程分析2016-09-12阅读3707
  • •Chromium为视频标签<video>全屏播放的过程分析2016-08-29阅读2486
  • •Chromium为视频标签<video>创建播放器的过程分析2016-08-15阅读6431
  • •Chromium分发输入事件给WebKit处理的过程分析2016-07-25阅读3490
  • •Chromium网页输入事件捕捉和手势检测过程分析2016-07-04阅读7027

更多文章

参考知识库

猜你在找
Android移植基础
话说linux内核-uboot和系统移植第14部分
CentOS7 Linux系统管理实战视频课程
红帽Linux系统企业内部实训
嵌入式Linux系统移植入门
Android进程间通信IPC机制Binder简要介绍和学习计划
Android进程间通信IPC机制Binder简要介绍和学习计划
Android进程间通信IPC机制Binder简要介绍和学习计划
Android进程间通信IPC机制Binder简要介绍和学习计划
Android进程间通信IPC机制Binder简要介绍和学习计划
查看评论
66楼 devwang_com 2016-08-29 19:32发表 [回复]
棒棒棒~
65楼 novas-meng 2016-05-12 07:54发表 [回复]
罗老师,信号(Signal)这个不光对父子进程有效吧
64楼 oTingFengXiYu 2016-05-09 14:50发表 [回复]
太高深了,完全看不懂,也没看到想要的答案,最后进程跟进程间是如何实现通信的例子呢,这个倒像是一个学术报告。就好比经济学家可以把商品的价格体现这种问题能分析出十几页,但是说白了用物以稀为贵就能说明白的问题了。代码呢,到底是怎么实现的,我们可以在代码里面根据自己想要的答案继续深究下去,而不是一箩筐的吧里面钢筋水泥全露出来,最后你告诉我钢筋水泥都在这了,混一下糊上去就行了。。。。

Re: 罗升阳 2016-05-09 17:52发表 [回复]
回复oTingFengXiYu:别喷了,省点力气,先把这个系列的文章看完了再说,要例子去找书看。

Re: sandy84n 2016-06-08 17:25发表 [回复]
回复Luoshengyang:对于这种人,老罗不必太在意
63楼 卫星是我朋友 2016-03-29 17:02发表 [回复]
罗大哥,佩服~学android就要有你这样的精神!
62楼 杭州山不高 2016-03-25 18:31发表 [回复]
看过,顶过!
61楼 feng_zhi_chao 2015-10-17 21:25发表 [回复]
谢谢楼主,好文章啊!
60楼 小白james 2015-09-22 17:06发表 [回复]
新手,完全看不懂啊,老罗,请问如何学习研究android源码

Re: Traxer 2015-12-27 16:41发表 [回复]
回复u011747761:从博主的第一篇文章开始边看边分析吧,文章都写的很详细的,分析完几篇会好一些了
59楼 real的IT之路 2015-06-05 22:20发表 [回复]
罗老师的分析太高深了,以至于有些地方根本看不懂。要同时具备c++ java 还有linux操作系统内核的知识,同时掌握的人很少的,同时也是比较牛的人。
58楼 ziyang3721 2015-03-06 17:02发表 [回复]
binder_mmap 会分配内核虚拟地址空间,这块一般只有100多M, 而基本上每个进程都会 mmap 1M,是不是说明只能同时允许 100个左右的进程?
57楼 qw345 2015-01-20 19:09发表 [回复]
已投票,期待更多精彩文章
56楼 wlbstc 2015-01-04 14:39发表 [回复]
学习到很多,楼主太好了。 已经投票“博客之星”
55楼 hefeipeng1993 2014-12-18 10:47发表 [回复]
LZ你好,我只是刚接触Framework层的学习,菜鸟一枚,有一点不明,就是Binder对于Android Framework的意义何在?愿赐教!

Re: 罗升阳 2014-12-20 01:34发表 [回复]
回复hefeipeng1993:意义很大,无时无刻都在用,等你慢慢深入学习framework就会体会到的了。
54楼 小熊先生kisCode 2014-12-01 18:44发表 [回复]
罗老师,qq群5还没加满,但是不允许你任何加入了..请问下还有其他可以加入的QQ群吗
53楼 liuyanggofurther 2014-09-08 21:29发表 [回复]
第二段第三行是命名管道哟 (命令管道 Named Pipe)
52楼 XHunterX 2014-08-18 09:39发表 [回复]
感谢博主的付出,向你这样的IT人致敬!
51楼 Dingo妹 2014-07-24 12:17发表 [回复]
虽然还是不懂,但是文章思路和讲解很清晰,谢谢楼主。
50楼 Dingo妹 2014-07-24 12:07发表 [回复]
http://blog.csdn.net/universus/article/details/6211589/ 《Android Binder设计与实现 - 设计篇》可以用这个链接
49楼 旧旧 2014-07-20 23:03发表 [回复]
好文章啊,应该早点看到的~~感谢楼主
48楼 floatingclouds 2014-06-05 20:24发表 [回复]
Binder机制详解系列:
Binder 机制详解—Binder IPC 程序结构:http://www.cloudchou.com/android/post-497.html
Binder 机制详解—Binder 系统架构: http://www.cloudchou.com/android/post-507.html
本地Binder框架通信原理: http://www.cloudchou.com/android/post-534.html
Binder 机制详解—Binder 本地框架: http://www.cloudchou.com/android/post-547.html
Binder 机制详解—Binder Java框架: http://www.cloudchou.com/android/post-558.html
Java层Binder框架通信原理: http://www.cloudchou.com/android/post-573.html
47楼 floatingclouds 2014-06-05 14:02发表 [回复]
我博客也写了一些Binder的博客,从入门到详解的资料,请楼主赐教。
这些入门资料都有详细的代码分析,也有托管在github上的demo源码下载。
Binder service入门–创建native binder service: http://www.cloudchou.com/android/post-332.html
Binder service入门—Framework binder service: http://www.cloudchou.com/android/post-447.html
Binder service入门—应用层binder service: http://www.cloudchou.com/android/post-458.html
Binder service入门—框架层、应用层调用native binder service: http://www.cloudchou.com/android/post-468.html
46楼 a2758963 2014-02-09 09:28发表 [回复]
每一个应用程序都是由一些Activity和Service组成的,一般Service运行在独立的进程中
--------------------------------------------------------------------------------下面是官方文档的说明,请博主确认:
A service runs in the main thread of its hosting process—the service does not create its own thread and does not run in a separate process (unless you specify otherwise).

Re: 罗升阳 2014-02-09 22:48发表 [回复]
回复a2758963:三年前的文章了,很久都时间梳理一下Service默认的确是运行在同一个进程里面,但是在AndroidManifest.xml可以将它们配置运行在独立的进程里面。已经修改过来了。
45楼 chishuideyu 2014-01-23 14:47发表 [回复]
太棒了,谢谢楼主,绝对收藏,写的真好,就需要这个,哈哈哈
44楼 漫游的民工 2014-01-04 17:19发表 [回复]
不得不佩服楼主很强大,受教了!
43楼 lymallen 2013-12-26 15:42发表 [回复]
这一系列的文章都很好,全面分析了android的进程间通信,很不错,多谢分享。
42楼 zhaoshenan 2013-12-09 22:28发表 [回复]
很好的文章,非常感谢罗老师分享,虽然有很多地方不懂
41楼 programmer_lxg 2013-11-05 10:38发表 [回复]
好得很
40楼 liuleiblog 2013-09-18 10:58发表 [回复]
问下罗老师,您阅读系统源码用什么工具啊?
39楼 sence 2013-09-10 14:40发表 [回复]
很好的文章,非常感谢楼主分享
38楼 sxq315 2013-09-09 21:21发表 [回复]
不错,收藏下
37楼 晓之不难 2013-08-29 13:08发表 [回复]
貌似还不错
36楼 chenxiaogang_324 2013-05-29 17:43发表 [回复]
罗老师:有个问题想请教你一下。每个进程都有很多线程在和binder驱动通信。当两个进程利用binder通信的时候利用的是哪个线程呢?为何这么多线程在和binder通信,但是代码中却始终看不到线程同步。比如在一个应用程序中启动一个activity,这个会和activitymanagerservice进行binder通信来启动。activitymanagerservice有自己的线程。systemserver中有很多读取binder驱动的线程。假设其中一个binder线程接收到了这个通信,它要在activitymanagerservice中history增加一个activityrecord对象。这个时候如果其他的应用程序也要启动一个一个activity,利用的是另外一个binde线程。这个时候找到的最顶端的activity究竟是哪个呢?这个问题困扰了我很久了,希望您能解答一下。

Re: 罗升阳 2013-05-29 18:25发表 [回复]
回复chenxiaogang_324:ActivityManagerService明显是有做线程同步
35楼 Sky_River 2013-05-20 15:38发表 [回复]
不好意思,可能我没讲清楚吧,我的意思是想知道在驱动中怎么样引用到binder_node这个结构,在binder_transaction_data中的target.ptr指向的是什么样的数据结构?我想知道的是binder实体在内核中的存在形式,不是binder对象。您能否指教下?
34楼 Sky_River 2013-05-17 09:40发表 [回复]
老罗,你好!看了这篇http://disanji.net/2011/02/28/android-bnder-design/,里边不断提到内核中的Binder实体与用户空间的Binder实体,在binder_transaction_data结构中有一个target域,如果是在接收方,文章里说target.ptr就是Binder对象的内存指针,我想问下这个指针具体指的是哪个数据结构?是binder_node结构么?

Re: 罗升阳 2013-05-17 10:21发表 [回复]
回复Sky_River:这些概念确实是很容易混淆,为了方便理解,我在《Android系统源代码情景分析》一书中对它们进行了区别:
1. 在用户空间,运行在Server端的称为Binder本地对象,运行在Client端的称为Binder代理对象。
2. 在内核空间,Binder实体对象用来描述Binder本地对象,Binder引用对象用来描述Binder代理对象。
3. 上述四种对象都统称为Binder对象。
关于这四种对象的作用和关系,《Android系统源代码情景分析》一书讲得很详细,博客也有讲,但是没有那么详细,这里我也很难用几句话就说清楚。
33楼 jia1015512573 2013-05-15 21:05发表 [回复]
罗哥你好,看完了这一系列的文章,受益匪浅,只是还有一个地方没有搞明白,客户端通过向ServiceManager查询,得到查询服务的结果后,是如何对binder接口进行改动的呢,因为刚开始建立的bpBInder绑定的是handle为0的ServiceManager,后来怎么又通过这个binder向Service发送数据了呢,还有就是ServiceManager管理的究竟是服务的什么东西,是服务的handle值吗?也就是ServiceManager返回给客户端的是Service的什么东西?希望罗哥指点小弟一番

Re: 罗升阳 2013-05-15 23:19发表 [回复]
回复jia1015512573:你不是一个地方没明白,是四个地方没明白了,呵呵,说明你看完了,但是还没理解,那四个问题都是很基本的问题。
32楼 red5613 2013-05-13 10:08发表 [回复]
学习中。。。。
31楼 red5613 2013-05-10 18:48发表 [回复]
收获中。
30楼 rickystudio 2013-05-09 15:46发表 [回复]
罗老师,中间的图是用什么工具画的?

Re: 罗升阳 2013-05-09 17:10发表 [回复]
回复rickystudio:word
29楼 demonshir 2013-04-27 21:11发表 [回复]
老罗你好,
看你书上对binder传递的数据分析挺详细的,但我还有疑问。
关于Client 获得实名Binder的引用,会向servicemanager发送请求数据,smgr从发送的数据中取出<名字>+<引用>然后查找列表。
书上逐层的分析到了flat_binder_object这个变量,想问下这个<名字>是保存哪个变量或哪个地址空间? ptr.buffer?
比如wifi Service,在变量里是否就存储wifiService这个字符串?
看了一些资料,但是一直没有把这个细节搞明白,还请指点。

Re: 罗升阳 2013-04-27 23:08发表 [回复]
回复demonshir:是的,保存在ptr.buffer里面。最开始的时候,这个字符串通过Parcel保存在一个binder_transaction_data的ptr.buffer里面,这个ptr.buffer是位于Client端的地址空间的,经过Binder驱动的时候,就会拷贝到Server端的地址空间去。在你说的情况下,这个Server端就是ServiceManager。ServiceManager将接收到的数据保存在一个binder_txn里面。binder_txn和binder_transaction_data的结构是一样的,也就是说,binder_txn里面的data就保存了你说的字符串。接着ServiceManager再通过一个binder_io来从binder_txn.data里面将那个字符串取出来。取出这个字符串之后,就可以得到一个对应的binder引用。这个binder引用经过Binder驱动返回给Client端的时候,又会被转换成Client端的一个binder引用。

Re: 罗升阳 2013-04-27 23:13发表 [回复]
回复Luoshengyang:ServiceManager不像其它的Service/Client一样,用Parcel来序列化和反序列化通信数据,也没有直接用binder_transaction_data来表示通信数据,它用的是binder_txn和binder_io,也就是说,binder_txn相当于binder_transaction_data,binder_io相当于Parcel,注意一下这个点,就会比较清楚数据的流向了。
28楼 qiuxiaolong007 2013-04-10 16:48发表 [回复]
老罗,你好!

由于种种原因,(客户要求),我们做了一个非常蛋疼的项目,是Qt for Android, 大部分困难基本克服,还有一项问题,我想请问你一下,请耐心看看哈~

简而言之,我们需要把一些进程间通讯的操作 封装在 /system/lib/myso.so中,这样用Binder机制是不是可行呢?

在linux下,项目通过共享内存实现的,现在向android下移植,遇到了困难,请提供一下思路,我对android不是很熟悉。谢谢

Re: 罗升阳 2013-04-10 18:01发表 [回复]
回复qiuxiaolong007:可以的啊,Binder机制本身就是封装在一个so里面给上层使用的。
27楼 edmond999 2013-03-08 17:32发表 [回复]
hello,老罗,想问下binder驱动会主动请求添加新的binder线程去处理事物,这是真的么?

Re: 罗升阳 2013-03-09 17:32发表 [回复]
回复edmond999:会的,不过进程可以设置Binder驱动最多可以请求创建的Binder线程的数量,这个值默认是16.
Re: edmond999 2013-03-08 17:39发表 [回复]
回复edmond999:第一,看了android Messanger的实现,怎么感觉也能够用binder实体对象的句柄创建proxy呢?这样子行的通么?
第二,Messanger好像既能处理同一个进程之间传递message,也能跨进程传递Message,是吗?如果第一个问题成立,那么第二个问题也就解决了。
下面这两个个链接讲解了一个Messanger的例子,既能进程内,也可以跨进程,呵呵,能否解答下上边两个问题?
http://wenku.baidu.com/view/0a396802eff9aef8941e0617.html
http://wenku.baidu.com/view/c2946a3e87c24028915fc313.html

Re: 罗升阳 2013-03-09 17:34发表 [回复]
回复edmond999:1. Binder Proxy本来就是简单地对一个Binder实体的句柄进行封装。
2. 同一个进程的不同线程也可以使用Binder机制,不过这时候是直接调用,不用经过Binder驱动,因为Binder驱动会对这种情况进行优化。

Re: edmond999 2013-03-11 11:38发表 [回复]
回复Luoshengyang:谢谢,仔细研究了一下,确实不同过binder驱动,在生成一个proxy时是用binder实体对象指针进行生成的,而不是生成一个BpXXX类型的对象,如下代码所示。所以proxy在调用transact时是直接调用的BBinder的transact,然后调用实体binder对象的onTransact函数,从而直接调用了service端的实现函数,对于是否跨多线程还是同一线程都是可以的,android的设计确实牛哇,老罗确实也很牛哇,哈哈~~~
status_t unflatten_binder(const sp<ProcessState>& proc, 
const Parcel& in, sp<IBinder>* out) 

const flat_binder_object* flat = in.readObject(false);

if (flat) { 
switch (flat->type) { 
case BINDER_TYPE_BINDER: 
*out = static_cast<IBinder*>(flat->cookie); 
return finish_unflatten_binder(NULL, *flat, in); 
case BINDER_TYPE_HANDLE: 
*out = proc->getStrongProxyForHandle(flat->handle); 
return finish_unflatten_binder( 
static_cast<BpBinder*>(out->get()), *flat, in); 


return BAD_TYPE; 
}

Re: edmond999 2013-03-12 16:07发表 [回复]
回复edmond999:写错了,生成BpXXX时使用的是本进程内的binder实体对象的指针,呵呵,笔误。如果binder实体对象在其他进程内的话就使用驱动里binder_ref结构体的uint32_t desc成员,也就是binder的引用句柄。
26楼 sada09 2013-03-07 09:38发表 [回复]
受益匪浅
25楼 BadPattern 2013-03-05 09:23发表 [回复]
问一个问题,java层调用service的远程接口,双方都持有一个相同的aidl文件,编译的时候会根据这个aidl文件生成一些相同的类来维持通信接口的约定。

那么native层的server和client拥有的共同通信接口是不是frameworks/base/include/binder下边的一堆头文件?通过Binder通信的都要include这些头文件?

Re: 罗升阳 2013-03-05 10:01发表 [回复]
回复dr8737010:frameworks/base/include/binder和frameworks/base/libs/binder这两个目录是Android系统提供的Binder库,无论是Java层的Client/Service,还是C++层的Client/Service,最终都是通过这个库提供的接口来完成Binder进程间通信的。这个Binder库只是对Binder驱动的封装而已,你也可以完全不使用它来执行Binder进程间通信,不过这样的话,你就要大费周章地写很多代码了。Android系统的Service Manager的实现就没有使用Binder库,具体可以看这篇文章:http://blog.csdn.net/luoshengyang/article/details/6621566
24楼 pfgmylove 2012-11-29 16:32发表 [回复]
你好,android的binder不是rpc机制吗?

Re: 罗升阳 2012-11-29 17:09发表 [回复]
回复pfgmylove:IPC机制
23楼 lidongelf 2012-11-14 16:22发表 [回复]
87 +v5
22楼 stevenhu_223 2012-08-16 19:05发表 [回复]
顶!!!
21楼 huangzhenyu1983 2012-07-16 11:37发表 [回复]
android上的rpc是同步的还是异步的?

Re: 罗升阳 2012-07-16 15:15发表 [回复]
回复huangzhenyu1983:可以是同步的,也可以是异步的。
20楼 Fendouliuhao 2012-07-15 09:34发表 [回复]
学习
19楼 ynb1687 2012-06-04 14:07发表 [回复]
学习了
18楼 YUMOMO_L 2012-04-24 16:14发表 [回复]
表示支持~
17楼 jifengyu_ok 2012-04-19 20:05发表 [回复]
楼主太牛了,太感谢楼主了
16楼 jindegegesun 2012-03-16 11:29发表 [回复]
楼主文章太霸道了,顶啊!
15楼 后知后觉 2012-02-29 09:50发表 [回复]
楼主很牛
14楼 wqhjfree 2012-02-09 11:26发表 [回复]
写的很详细, 对深入研究android有很大帮主, 顶起
13楼 kevinhe0472 2012-02-03 16:06发表 [回复]
支持楼主的每一篇文章!
12楼 无枝可依 2012-01-31 16:09发表 [回复]
楼主,建议你出书。

现在市面上介绍android系统结构的书几乎没有,就算有,也是挂羊头卖狗肉。 跟你写的差远了

11楼 androidboy365 2011-11-23 10:51发表 [回复]
写的不错,分析的很清晰啊,转载收录了
10楼 小姚丹 2011-11-20 00:19发表 [回复]
业余得太专业了!!我最近开始学android,非常感谢您的文章
9楼 Gongqingshuai 2011-11-15 15:59发表 [回复]
冒昧的问一下,楼主现在从事android哪方面的工作啊?研究andorid多久了呢?看您对android知之甚深,所以就想了解一下。

Re: 罗升阳 2011-11-15 22:46发表 [回复]
回复Gongqingshuai:业余研究

Re: wqhjfree 2012-02-09 11:27发表 [回复]
回复Luoshengyang:业余研究都能这么专业
8楼 winerluo 2011-11-03 18:58发表 [回复]
山穷水尽儗无路,柳暗花明又一村。
7楼 wantianpei 2011-09-19 14:17发表 [回复]
顶.
6楼 dulaiduqu 2011-09-05 08:43发表 [回复]
service不是运行在独立的进程中吧,SDK中有这样一句话:A service runs in the main thread of its hosting process—the service does not create its own thread and does not run in a separate process (unless you specify otherwise).

Re: 罗升阳 2011-09-05 10:16发表 [回复]
回复dulaiduqu:不过怎么理解Android中的进程,可能大家的想法会有点偏差,因为Android系统是基于Linux内核的,在Linux内核里面,没有线程的概念,都是称为进程或者任务,所以我这里说的进程,有时候也可以理解为线程,它和启动它的应用程序进程是共享代码的。
Re: 罗升阳 2011-09-05 10:10发表 [回复]
回复dulaiduqu:Service一般是运行在独立的进程中,当然也可以和其它Activity运行在同一个进程中,取决于这个Service在AndroidManifest.xml文件的配置以及调用什么函数来启动它,典型的Activity管理服务ActivityManagerService和Package管理服务PackageManagerService就是运行在独立的进程,因为Service是没有UI的,所以把它放在独立的进程中来运行,做一些计算型逻辑更合理,详细你可以参考后面一篇文章《Android系统在新进程中启动自定义服务过程(startService)的原理分析》,接下来还会有一篇文章是描述在进程内部启动Service的,有兴趣的话可以关注一下。
5楼 lpboss 2011-09-02 10:03发表 [回复]
楼主你好,刚刚开始学习android,我想请教一下,servicemanager打开binder时,后面都会把binder映射到共享内存中如:
bs->fd = open("/dev/binder", O_RDWR);
if (bs->fd < 0) {
LOGE("binder: cannot open device (%s)\n",
strerror(errno));
goto fail_open;
}

bs->mapsize = mapsize;
bs->mapped = mmap(NULL, mapsize, PROT_READ, MAP_PRIVATE, bs->fd, 0);
两端都有映射,但我没有看到有哪个在使用这段共享内存的~弄得很晕。求赐教!!

Re: 罗升阳 2011-09-02 11:28发表 [回复]
回复lpboss:如果仔细阅读一下博客后面两篇文章《浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路》和《Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析》,对这个问题就会比较清楚了
4楼 kennyirene 2011-08-30 15:52发表 [回复]
学习了
3楼 black_berry 2011-07-20 22:09发表 [回复]
很好,转了。辛苦了
2楼 doumiwang 2011-07-20 14:54发表 [回复]
说的非常好,如果不同的应用程序,虽然用了相同的数字证书签名,但是没有放在同一个进程里运行,那么他们之间还能互相访问数据吗?还能访问另一个程序的代码吗?可以看看这个链接,帮助解答一下,谢谢!http://doumiw.com/market/community/t!showTopic.do?topicId=24

Re: 罗升阳 2011-07-20 15:26发表 [回复]
回复doumiwang:以什么方来来访问数据、访问代码?这个说得太抽象了,最好还是自己写代码来实践一下。
还有,Android的Binder机制跟数字签名没有关系。
1楼 mci2004 2011-07-20 10:28发表 [回复]
SF
LZ你写的太好了,我们很是佩服,我们公司也是搞Android的你的文章被我们几个新进的应届生争相追逐,希望LZ能尽早更新!

PS:LZ身体要紧啊!2点多了还在更新文章.......

Re: 罗升阳 2011-07-20 15:27发表 [回复]
回复mci2004:感谢关注
原文地址: http://blog.csdn.net/luoshengyang/article/details/6618363

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

  1. Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划

    前面我们从Android应用程序与SurfaceFlinger服务的关系出发,从侧面简单学习了SurfaceFlinger服务.有了这些预备知识之后,我们就可以从正面来分析SurfaceFlinger ...

  2. Android系统匿名共享内存Ashmem(Anonymous Shared Memory)简要介绍和学习计划

    在Android系统中,提供了独特的匿名共享内存子系统Ashmem(Anonymous Shared Memory),它以驱动程序的形式实现在内核空间中.它有两个特点,一是能够辅助内存管理系统来有效地 ...

  3. Android应用程序组件Content Provider简要介绍和学习计划

    在Android系统中,Content Provider作为应用程序四大组件之一,它起到在应用程序之间共享数据的作用,同时,它还是标准的数据访问接口.前面的一系列文章已经分析过Android应用程序的 ...

  4. 老郭的《Dalvik虚拟机垃圾收集机制简要介绍和学习计划》

    伴随着"Dalvik is dead,long live Dalvik"这行AOSP代码提交日志,在Android5.0中,ART运行时取代了Dalvik虚拟机.虽然Dalvik虚 ...

  5. Android窗口管理服务WindowManagerService的简要介绍和学习计划

    在前一个系列文章中,我们从个体的角度来分析了Android应用程序窗口的实现框架.事实上,如果我们从整体的角度来看,Android应用程序窗口的实现要更复杂,因为它们的类型和作用不同,且会相互影响.在 ...

  6. Android WebView简要介绍和学习计划

    我们通常会在App的UI中嵌入WebView,用来实现某些功能的动态更新.在4.4版本之前,Android WebView基于WebKit实现.不过,在4.4版本之后,Android WebView就 ...

  7. Chromium视频标签video简要介绍和学习计划

    随着互联网的发展,在网页上观看视频变得越来越流行,尤其是泛娱乐(手机直播)大行其道的今天.在HTML5之前,在网页上播放视频需要插件支持,例如Flash插件.有了HTML5之后,标签<video ...

  8. Chromium插件(Plugin)机制简要介绍和学习计划

    在Chromium中,除了可以使用Extension增强浏览器功能,还可以使用Plugin.两者最大区别是前者用JS开发,后者用C/C++开发.这意味着Plugin以Native Code运行,在性能 ...

  9. 深入理解 Android 的 IPC 机制--------Binder

    在android中,,应用程序虽然是以独立的进程来运行的,但相互之间还是需要通信..比如,,我们的应用程序 和后台服务往往会运行不同的进程当中,,各自有这独立内存地址空间,,,但是又要彼此互相合作,, ...

最新文章

  1. 3层-CNN卷积神经网络预测MNIST数字
  2. nero 8 简体中文版能生成真正能用的序列号的注册机
  3. eclipse打开当前文件所在文件夹
  4. h5 storage事件监听
  5. 【HDU - 5777】domino(贪心)
  6. Oracle中关于计算时间差的例子:
  7. html5控制符置于底层,HTML5占位符在焦点上消失
  8. 配置nginx作为静态资源服务器 css,js,image等资源直接访问
  9. C#调用Couchbase中的Memcached缓存
  10. [转载]android一些、面试题
  11. CListCtrl 使用技巧 1
  12. Node.js 的原型注入方法
  13. 2018最新私塾在线高级java软件架构师实战培训
  14. 外挂制作--------NP认识
  15. SSH框架之文件上传
  16. 算法交易的机遇和挑战
  17. 走进脑计划(四):linux下安装SPM、DPABI
  18. edk2中的fdf文件简介
  19. IP协议详解之IPv6头部结构简介
  20. 超分算法RDN:Residual Dense Network for Image Super-Resolution 超分辨率图像重建

热门文章

  1. sql表合并,统计计算,生成总计
  2. TensorFlow 中文文档 介绍
  3. Go 语言框架 Gin 练习2
  4. Matlab中特征降维主成分分析(PCA)使用方法(整套流程)
  5. 5月份升级鸿蒙系统的华为手机名单,鸿蒙OS前三批升级名单曝光,华为荣耀手机可升级,幸福来得太突然...
  6. ”语义分割”中的“语义”
  7. 利用matlab对xml文件进行批量处理
  8. [云炬创业管理笔记]第九章为创业成败而准备测试1
  9. [云炬创业管理笔记]第一章测试3
  10. IP插件:批量替换论文图片