100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > Android进程间通信(IPC)机制Binder简要介绍和学习计划

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

时间:2022-03-09 02:44:27

相关推荐

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

在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接口源代码分析。

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

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

我的同类文章

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

参考知识库

猜你在找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-08-29 19:32发表[回复]棒棒棒~ 65楼novas-meng-05-12 07:54发表[回复]罗老师,信号(Signal)这个不光对父子进程有效吧 64楼oTingFengXiYu-05-09 14:50发表[回复]太高深了,完全看不懂,也没看到想要的答案,最后进程跟进程间是如何实现通信的例子呢,这个倒像是一个学术报告。就好比经济学家可以把商品的价格体现这种问题能分析出十几页,但是说白了用物以稀为贵就能说明白的问题了。代码呢,到底是怎么实现的,我们可以在代码里面根据自己想要的答案继续深究下去,而不是一箩筐的吧里面钢筋水泥全露出来,最后你告诉我钢筋水泥都在这了,混一下糊上去就行了。。。。 Re:罗升阳-05-09 17:52发表[回复]回复oTingFengXiYu:别喷了,省点力气,先把这个系列的文章看完了再说,要例子去找书看。 Re:sandy84n-06-08 17:25发表[回复]回复Luoshengyang:对于这种人,老罗不必太在意 63楼卫星是我朋友-03-29 17:02发表[回复]罗大哥,佩服~学android就要有你这样的精神! 62楼杭州山不高-03-25 18:31发表[回复]看过,顶过! 61楼feng_zhi_chao-10-17 21:25发表[回复]谢谢楼主,好文章啊! 60楼小白james-09-22 17:06发表[回复]新手,完全看不懂啊,老罗,请问如何学习研究android源码 Re:Traxer-12-27 16:41发表[回复]回复u011747761:从博主的第一篇文章开始边看边分析吧,文章都写的很详细的,分析完几篇会好一些了 59楼real的IT之路-06-05 22:20发表[回复]罗老师的分析太高深了,以至于有些地方根本看不懂。要同时具备c++ java 还有linux操作系统内核的知识,同时掌握的人很少的,同时也是比较牛的人。 58楼ziyang3721-03-06 17:02发表[回复]binder_mmap 会分配内核虚拟地址空间,这块一般只有100多M, 而基本上每个进程都会 mmap 1M,是不是说明只能同时允许 100个左右的进程? 57楼qw345-01-20 19:09发表[回复]已投票,期待更多精彩文章 56楼wlbstc-01-04 14:39发表[回复]学习到很多,楼主太好了。 已经投票“博客之星” 55楼hefeipeng1993-12-18 10:47发表[回复]LZ你好,我只是刚接触Framework层的学习,菜鸟一枚,有一点不明,就是Binder对于Android Framework的意义何在?愿赐教! Re:罗升阳-12-20 01:34发表[回复]回复hefeipeng1993:意义很大,无时无刻都在用,等你慢慢深入学习framework就会体会到的了。 54楼小熊先生kisCode-12-01 18:44发表[回复]罗老师,qq群5还没加满,但是不允许你任何加入了..请问下还有其他可以加入的QQ群吗 53楼liuyanggofurther-09-08 21:29发表[回复]第二段第三行是命名管道哟 (命令管道 Named Pipe) 52楼XHunterX-08-18 09:39发表[回复]感谢博主的付出,向你这样的IT人致敬! 51楼Dingo妹-07-24 12:17发表[回复]虽然还是不懂,但是文章思路和讲解很清晰,谢谢楼主。 50楼Dingo妹-07-24 12:07发表[回复]/universus/article/details/6211589/ 《Android Binder设计与实现 - 设计篇》可以用这个链接 49楼旧旧-07-20 23:03发表[回复]好文章啊,应该早点看到的~~感谢楼主 48楼floatingclouds-06-05 20:24发表[回复]Binder机制详解系列:

Binder 机制详解—Binder IPC 程序结构:/android/post-497.html

Binder 机制详解—Binder 系统架构: /android/post-507.html

本地Binder框架通信原理: /android/post-534.html

Binder 机制详解—Binder 本地框架: /android/post-547.html

Binder 机制详解—Binder Java框架: /android/post-558.html

Java层Binder框架通信原理: /android/post-573.html 47楼floatingclouds-06-05 14:02发表[回复]我博客也写了一些Binder的博客,从入门到详解的资料,请楼主赐教。

这些入门资料都有详细的代码分析,也有托管在github上的demo源码下载。

Binder service入门–创建native binder service: /android/post-332.html

Binder service入门—Framework binder service: /android/post-447.html

Binder service入门—应用层binder service: /android/post-458.html

Binder service入门—框架层、应用层调用native binder service: /android/post-468.html 46楼a2758963-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:罗升阳-02-09 22:48发表[回复]回复a2758963:三年前的文章了,很久都时间梳理一下Service默认的确是运行在同一个进程里面,但是在AndroidManifest.xml可以将它们配置运行在独立的进程里面。已经修改过来了。 45楼chishuideyu-01-23 14:47发表[回复]太棒了,谢谢楼主,绝对收藏,写的真好,就需要这个,哈哈哈 44楼漫游的民工-01-04 17:19发表[回复]不得不佩服楼主很强大,受教了! 43楼lymallen-12-26 15:42发表[回复]这一系列的文章都很好,全面分析了android的进程间通信,很不错,多谢分享。 42楼zhaoshenan-12-09 22:28发表[回复]很好的文章,非常感谢罗老师分享,虽然有很多地方不懂 41楼programmer_lxg-11-05 10:38发表[回复]好得很 40楼liuleiblog-09-18 10:58发表[回复]问下罗老师,您阅读系统源码用什么工具啊? 39楼sence-09-10 14:40发表[回复]很好的文章,非常感谢楼主分享 38楼sxq315-09-09 21:21发表[回复]不错,收藏下 37楼晓之不难-08-29 13:08发表[回复]貌似还不错 36楼chenxiaogang_324-05-29 17:43发表[回复]罗老师:有个问题想请教你一下。每个进程都有很多线程在和binder驱动通信。当两个进程利用binder通信的时候利用的是哪个线程呢?为何这么多线程在和binder通信,但是代码中却始终看不到线程同步。比如在一个应用程序中启动一个activity,这个会和activitymanagerservice进行binder通信来启动。activitymanagerservice有自己的线程。systemserver中有很多读取binder驱动的线程。假设其中一个binder线程接收到了这个通信,它要在activitymanagerservice中history增加一个activityrecord对象。这个时候如果其他的应用程序也要启动一个一个activity,利用的是另外一个binde线程。这个时候找到的最顶端的activity究竟是哪个呢?这个问题困扰了我很久了,希望您能解答一下。 Re:罗升阳-05-29 18:25发表[回复]回复chenxiaogang_324:ActivityManagerService明显是有做线程同步 35楼Sky_River-05-20 15:38发表[回复]不好意思,可能我没讲清楚吧,我的意思是想知道在驱动中怎么样引用到binder_node这个结构,在binder_transaction_data中的target.ptr指向的是什么样的数据结构?我想知道的是binder实体在内核中的存在形式,不是binder对象。您能否指教下? 34楼Sky_River-05-17 09:40发表[回复]老罗,你好!看了这篇//02/28/android-bnder-design/,里边不断提到内核中的Binder实体与用户空间的Binder实体,在binder_transaction_data结构中有一个target域,如果是在接收方,文章里说target.ptr就是Binder对象的内存指针,我想问下这个指针具体指的是哪个数据结构?是binder_node结构么? Re:罗升阳-05-17 10:21发表[回复]回复Sky_River:这些概念确实是很容易混淆,为了方便理解,我在《Android系统源代码情景分析》一书中对它们进行了区别:

1. 在用户空间,运行在Server端的称为Binder本地对象,运行在Client端的称为Binder代理对象。

2. 在内核空间,Binder实体对象用来描述Binder本地对象,Binder引用对象用来描述Binder代理对象。

3. 上述四种对象都统称为Binder对象。

关于这四种对象的作用和关系,《Android系统源代码情景分析》一书讲得很详细,博客也有讲,但是没有那么详细,这里我也很难用几句话就说清楚。 33楼jia1015512573-05-15 21:05发表[回复]罗哥你好,看完了这一系列的文章,受益匪浅,只是还有一个地方没有搞明白,客户端通过向ServiceManager查询,得到查询服务的结果后,是如何对binder接口进行改动的呢,因为刚开始建立的bpBInder绑定的是handle为0的ServiceManager,后来怎么又通过这个binder向Service发送数据了呢,还有就是ServiceManager管理的究竟是服务的什么东西,是服务的handle值吗?也就是ServiceManager返回给客户端的是Service的什么东西?希望罗哥指点小弟一番 Re:罗升阳-05-15 23:19发表[回复]回复jia1015512573:你不是一个地方没明白,是四个地方没明白了,呵呵,说明你看完了,但是还没理解,那四个问题都是很基本的问题。 32楼red5613-05-13 10:08发表[回复]学习中。。。。 31楼red5613-05-10 18:48发表[回复]收获中。 30楼rickystudio-05-09 15:46发表[回复]罗老师,中间的图是用什么工具画的? Re:罗升阳-05-09 17:10发表[回复]回复rickystudio:word 29楼demonshir-04-27 21:11发表[回复]老罗你好,

看你书上对binder传递的数据分析挺详细的,但我还有疑问。

关于Client 获得实名Binder的引用,会向servicemanager发送请求数据,smgr从发送的数据中取出<名字>+<引用>然后查找列表。

书上逐层的分析到了flat_binder_object这个变量,想问下这个<名字>是保存哪个变量或哪个地址空间? ptr.buffer?

比如wifi Service,在变量里是否就存储wifiService这个字符串?

看了一些资料,但是一直没有把这个细节搞明白,还请指点。 Re:罗升阳-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:罗升阳-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-04-10 16:48发表[回复]老罗,你好!

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

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

在linux下,项目通过共享内存实现的,现在向android下移植,遇到了困难,请提供一下思路,我对android不是很熟悉。谢谢 Re:罗升阳-04-10 18:01发表[回复]回复qiuxiaolong007:可以的啊,Binder机制本身就是封装在一个so里面给上层使用的。 27楼edmond999-03-08 17:32发表[回复]hello,老罗,想问下binder驱动会主动请求添加新的binder线程去处理事物,这是真的么? Re:罗升阳-03-09 17:32发表[回复]回复edmond999:会的,不过进程可以设置Binder驱动最多可以请求创建的Binder线程的数量,这个值默认是16. Re:edmond999-03-08 17:39发表[回复]回复edmond999:第一,看了android Messanger的实现,怎么感觉也能够用binder实体对象的句柄创建proxy呢?这样子行的通么?

第二,Messanger好像既能处理同一个进程之间传递message,也能跨进程传递Message,是吗?如果第一个问题成立,那么第二个问题也就解决了。

下面这两个个链接讲解了一个Messanger的例子,既能进程内,也可以跨进程,呵呵,能否解答下上边两个问题?

/view/0a396802eff9aef8941e0617.html

/view/c2946a3e87c24028915fc313.html Re:罗升阳-03-09 17:34发表[回复]回复edmond999:1. Binder Proxy本来就是简单地对一个Binder实体的句柄进行封装。

2. 同一个进程的不同线程也可以使用Binder机制,不过这时候是直接调用,不用经过Binder驱动,因为Binder驱动会对这种情况进行优化。 Re:edmond999-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-03-12 16:07发表[回复]回复edmond999:写错了,生成BpXXX时使用的是本进程内的binder实体对象的指针,呵呵,笔误。如果binder实体对象在其他进程内的话就使用驱动里binder_ref结构体的uint32_t desc成员,也就是binder的引用句柄。26楼sada09-03-07 09:38发表[回复]受益匪浅 25楼BadPattern-03-05 09:23发表[回复]问一个问题,java层调用service的远程接口,双方都持有一个相同的aidl文件,编译的时候会根据这个aidl文件生成一些相同的类来维持通信接口的约定。

那么native层的server和client拥有的共同通信接口是不是frameworks/base/include/binder下边的一堆头文件?通过Binder通信的都要include这些头文件? Re:罗升阳-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库,具体可以看这篇文章:/luoshengyang/article/details/6621566 24楼pfgmylove-11-29 16:32发表[回复]你好,android的binder不是rpc机制吗? Re:罗升阳-11-29 17:09发表[回复]回复pfgmylove:IPC机制 23楼lidongelf-11-14 16:22发表[回复]87 +v5 22楼stevenhu_223-08-16 19:05发表[回复]顶!!! 21楼huangzhenyu1983-07-16 11:37发表[回复]android上的rpc是同步的还是异步的? Re:罗升阳-07-16 15:15发表[回复]回复huangzhenyu1983:可以是同步的,也可以是异步的。 20楼Fendouliuhao-07-15 09:34发表[回复]学习 19楼ynb1687-06-04 14:07发表[回复]学习了 18楼YUMOMO_L-04-24 16:14发表[回复]表示支持~ 17楼jifengyu_ok-04-19 20:05发表[回复]楼主太牛了,太感谢楼主了 16楼jindegegesun-03-16 11:29发表[回复]楼主文章太霸道了,顶啊! 15楼后知后觉-02-29 09:50发表[回复]楼主很牛 14楼wqhjfree-02-09 11:26发表[回复]写的很详细, 对深入研究android有很大帮主, 顶起 13楼kevinhe0472-02-03 16:06发表[回复]支持楼主的每一篇文章! 12楼无枝可依-01-31 16:09发表[回复]楼主,建议你出书。

现在市面上介绍android系统结构的书几乎没有,就算有,也是挂羊头卖狗肉。 跟你写的差远了 11楼androidboy365-11-23 10:51发表[回复]写的不错,分析的很清晰啊,转载收录了 10楼小姚丹-11-20 00:19发表[回复]业余得太专业了!!我最近开始学android,非常感谢您的文章 9楼Gongqingshuai-11-15 15:59发表[回复]冒昧的问一下,楼主现在从事android哪方面的工作啊?研究andorid多久了呢?看您对android知之甚深,所以就想了解一下。 Re:罗升阳-11-15 22:46发表[回复]回复Gongqingshuai:业余研究 Re:wqhjfree-02-09 11:27发表[回复]回复Luoshengyang:业余研究都能这么专业 8楼winerluo-11-03 18:58发表[回复]山穷水尽儗无路,柳暗花明又一村。 7楼wantianpei-09-19 14:17发表[回复]顶. 6楼dulaiduqu-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:罗升阳-09-05 10:16发表[回复]回复dulaiduqu:不过怎么理解Android中的进程,可能大家的想法会有点偏差,因为Android系统是基于Linux内核的,在Linux内核里面,没有线程的概念,都是称为进程或者任务,所以我这里说的进程,有时候也可以理解为线程,它和启动它的应用程序进程是共享代码的。 Re:罗升阳-09-05 10:10发表[回复]回复dulaiduqu:Service一般是运行在独立的进程中,当然也可以和其它Activity运行在同一个进程中,取决于这个Service在AndroidManifest.xml文件的配置以及调用什么函数来启动它,典型的Activity管理服务ActivityManagerService和Package管理服务PackageManagerService就是运行在独立的进程,因为Service是没有UI的,所以把它放在独立的进程中来运行,做一些计算型逻辑更合理,详细你可以参考后面一篇文章《Android系统在新进程中启动自定义服务过程(startService)的原理分析》,接下来还会有一篇文章是描述在进程内部启动Service的,有兴趣的话可以关注一下。 5楼lpboss-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:罗升阳-09-02 11:28发表[回复]回复lpboss:如果仔细阅读一下博客后面两篇文章《浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路》和《Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析》,对这个问题就会比较清楚了 4楼kennyirene-08-30 15:52发表[回复]学习了 3楼black_berry-07-20 22:09发表[回复]很好,转了。辛苦了 2楼doumiwang-07-20 14:54发表[回复]说的非常好,如果不同的应用程序,虽然用了相同的数字证书签名,但是没有放在同一个进程里运行,那么他们之间还能互相访问数据吗?还能访问另一个程序的代码吗?可以看看这个链接,帮助解答一下,谢谢!/market/community/t!showTopic.do?topicId=24 Re:罗升阳-07-20 15:26发表[回复]回复doumiwang:以什么方来来访问数据、访问代码?这个说得太抽象了,最好还是自己写代码来实践一下。

还有,Android的Binder机制跟数字签名没有关系。 1楼mci-07-20 10:28发表[回复]SF

LZ你写的太好了,我们很是佩服,我们公司也是搞Android的你的文章被我们几个新进的应届生争相追逐,希望LZ能尽早更新!

PS:LZ身体要紧啊!2点多了还在更新文章....... Re:罗升阳-07-20 15:27发表[回复]回复mci:感谢关注

原文地址:/luoshengyang/article/details/6618363

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。