在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(175)
  • Chromium扩展(Extension)的页面(Page)加载过程分析2016-09-19阅读967
  • Chromium扩展(Extension)机制简要介绍和学习计划2016-09-05阅读14606
  • Chromium为视频标签
  • Chromium视频标签
  • Chromium网页滑动和捏合手势处理过程分析2016-07-11阅读5373
  • Chromium网页输入事件处理机制简要介绍和学习计划2016-06-27阅读5352
  • Chromium扩展(Extension)加载过程分析2016-09-12阅读3707
  • Chromium为视频标签
  • Chromium为视频标签
  • 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& proc, 
const Parcel& in, sp* out) 

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

if (flat) { 
switch (flat->type) { 
case BINDER_TYPE_BINDER: 
*out = static_cast(flat->cookie); 
return finish_unflatten_binder(NULL, *flat, in); 
case BINDER_TYPE_HANDLE: 
*out = proc->getStrongProxyForHandle(flat->handle); 
return finish_unflatten_binder( 
static_cast(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

更多相关文章

  1. Android反射机制技术的使用示例
  2. Android碎片化机制
  3. Android Gradle Release Version 2.4 增加多进程并行编译,经测试
  4. Android之Message机制的灵活应用
  5. android handler 线程机制的研究
  6. 在android中获取系统正在运行的进程
  7. Android应用程序键盘(Keyboard)消息处理机制分析(2)

随机推荐

  1. Android 自定义控件 ViewPager头部指示器
  2. android Linux常用命令
  3. android 获取设备支持的编解码器的方法
  4. [转载]android下activity中两个listview
  5. Android开发必备的21个免费资源和工具
  6. android wheel实现各种选择效果
  7. linux tar.gz zip 减压 压缩命令
  8. Android Glide缓存清除与获取缓存大小
  9. android 存储方法一SharedPreferences存
  10. Android ViewPager多页面滑动切换以及底