欢迎来到天天文库
浏览记录
ID:37708163
大小:159.50 KB
页数:20页
时间:2019-05-29
《Android IPC 通讯机制源码分析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、AndroidIPC通讯机制源码分析 编辑文档Binder通信简介: linux系统中进程间通信的方式有:socket,namedpipe,messagequeque,signal,sharememory。Java系统中的进程间通信方式有socket,namedpipe等,Android应用程序理所当然可以应用JAVA的IPC机制实现进程间的通信,但我查看android的源码,在同一终端上的应用软件的通信几乎看不到这些IPC通信方式,取而代之的是Binder通信。google为什么要采用这种方式呢,这取决于Binder通信方式的高效率。Binder通信是通过linux的binderd
2、river来实现的,Binder通信操作类似线程迁移(threadmigration),两个进程间IPC看起来就象是一个进程进入另一个进程执行代码然后带着执行的结果返回。Binder的用户空间为每一个进程维护着一个可用的线程池,线程池用于处理到来的IPC以及执行进程本地消息,Binder通信是同步而不是异步。 Android中的Binder通信是基于Service与Client的,所有需要IBinder通信的进程都必须创建一个IBinder接口,系统中有一个进程管理所有的systemservice,Android不允许用户添加非授权的Systemservice,当然现在源码开发了,我们可
3、以修改一些代码来实现添加底层systemService的目的。对用户程序来说,我们也要创建server,或者Service用于进程间通信,这里有一个ActivityManagerService管理JAVA应用层所有的service创建与连接(connect),disconnect,所有的Activity也是通过这个service来启动,加载的。ActivityManagerService也是加载在SystemsServcie中的。 Android虚拟机启动之前系统会先启动serviceManager进程,serviceManager打开binder驱动,并通知binderkernel驱动
4、程序这个进程将作为SystemServiceManager,然后该进程将进入一个循环,等待处理来自其他进程的数据。用户创建一个Systemservice后,通过defaultServiceManager得到一个远程ServiceManager的接口,通过这个接口我们可以调用addService函数将Systemservice添加到ServiceManager进程中,然后client可以通过getService获取到需要连接的目的Service的IBinder对象,这个IBinder是Service的BBinder在binderkernel的一个参考,所以serviceIBinder在bind
5、erkernel中不会存在相同的两个IBinder对象,每一个Client进程同样需要打开Binder驱动程序。对用户程序而言,我们获得这个对象就可以通过binderkernel访问service对象中的方法。Client与Service在不同的进程中,通过这种方式实现了类似线程间的迁移的通信方式,对用户程序而言当调用Service返回的IBinder接口后,访问Service中的方法就如同调用自己的函数。下图为client与Service建立连接的示意图 首先从ServiceManager注册过程来逐步分析上述过程是如何实现的。ServiceMananger进程注册过程源码分析:Serv
6、iceManagerProcess(Service_manager.c): Service_manager为其他进程的Service提供管理,这个服务程序必须在AndroidRuntime起来之前运行,否则AndroidJAVAVmActivityManagerService无法注册。intmain(intargc,char**argv){ structbinder_state*bs; void*svcmgr=BINDER_SERVICE_MANAGER; bs=binder_open(128*1024);//打开/dev/binder驱动 if(binder_becom
7、e_context_manager(bs)){//注册为servicemanagerinbinderkernel LOGE("cannotbecomecontextmanager(%s)",strerror(errno)); return-1; } svcmgr_handle=svcmgr; binder_loop(bs,svcmgr_handler); retur
此文档下载收益归作者所有