【Android源码 栏目提醒】:网学会员Android源码 为您提供Android系统的Binder机制之二——服务代理对象(1) - 综合课件参考,解决您在Android系统的Binder机制之二——服务代理对象(1) - 综合课件学习中工作中的难题,参考学习。
Android系统的Binder机制之二——服务代理对象1 1 / 11
Android系统的Binder机制之二——服务代理对象1 上文《
Android系统的Binder机制之一——Service Manager》我们学习了Service Manager在
Android Binder中的作用——服务Service注册服务Service查询的功能。
本文我们一起学习服务Service在客户端中的代理机制。
重点介绍其核心对象BpBinder。
1、服务代理的原理 如下是客户端请求service服务的场景 1、首先客户端向Service manager查找相应的Service。
上文《
Android系统的Binder机制之一——Service Manager》有比较详细的介绍。
注意客户端和Service可能在两个不同的进程中。
2、
Android系统将会为客户端进程中创建一个Service代理。
下文将详细介绍该创建过程。
3、客户端视角只有Service代理他所有对Service的请求都发往Service代理然后有Service代理把用户请求转发给Service本身。
Service处理完成之后把结果返回给Service代理Service代理负责把处理结果返回给客户端。
注意客户端对Service代理的调用都是同步调用调用挂住直到调用返回为止这样客户端视角来看调用远端Service的服
Android系统的Binder机制之二——服务代理对象1 2 / 11 务和调用本地的函数没有任何区别。
这也是Binder机制的一个特点。
2、
Android进程环境——ProcessState类型和对象 在
Android系统中任进程何要想使用Binder机制必须要创建一个ProcessState对象和IPCThreadState对象。
当然如果
Android进程不使用Binder机制那么这两个对象是不用创建的。
这种情况很少见因为Binder机制是整个
Android框架的基础可以说影响到
Android方方面面。
所以说了解这两个对象的作用非常重要。
台湾的高焕堂先生一片文章《认识ProcessState类型和对象》可以在我的博文《转高焕堂——
Android框架底层结构知多少》中找到。
可以先通过这篇文章对ProcessState进行一个大概了解。
ProcessState是一个singleton类型一个进程只能创建一个他的对象。
他的作用是维护当前进程中所有Service代理BpBinder对象。
一个客户端进程可能需要多个Service的服务这样可能会创建多个Service代理BpBinder对象客户端进程中的ProcessState对象将会负责维护这些Service代理。
我们研究一下创建一个Service代理的代码
Android系统的Binder机制之二——服务代理对象1 3 / 11 sp ProcessState::getStrongProxyForHandleint32_t handle sp result AutoMutex _lmLock handle_entry e lookupHandleLockedhandle if e NULL // We need to create a new BpBinder if there isnt currently one OR we // are unable to acquire a weak reference on this current one. See comment // in getWeakProxyForHandle for more info about this. IBinder b e-binder if b NULL e-refs-attemptIncWeakthis b new BpBinderhandle e-binder b if b e-refs b-getWeakRefs result b else // This little bit of nastyness is to allow us to add a primary // reference to the remote proxy when this team doesnt have one // but another team is sending the handle to us.
Android系统的Binder机制之二——服务代理对象1 4 / 11 result.force_setb e-refs-decWeakthis return result getWeakProxyForHandle函数的作用是根据一个binder句柄上文《
Android系统的Binder机制之一——Service Manager》提到Binder驱动为每个Service维护一个Binder句柄客户端可以通过句柄来和Service通讯创建对应的Service代理对象。
当前进程首先调用lookupHandleLocked函数去查看当前进程维护的Service代理对象的列表该待创建Service代理对象是否已经在当前进程中创建如果已经创建过了则直接返回其引用就可以了。
否则将会在Service代理对象的列表增加相应的位置注意系统为了减少分配开销可能会多分配一些空间策略是“以空间换时间”保存将要创建的代理对象。
具体代码请参考lookupHandleLocked的
源码。
Android系统的Binder机制之二——服务代理对象1 5 / 11 后面代码就好理解了如果Service代理对象已经创建过了直接增加引用计数就行了。
若没有创建过则需要创建一个新的Service代理对象。
3、
Android进程环境——IPCThreadState类型和对象
Android进程中可以创建一个ProcessState对象该对象创建过程中会打开/dev/binder设备并保存其句柄。
并初始化该设备。
代码如下 ProcessState::ProcessState : mDriverFDopen_driver mVMStartMAP_FAILED mManagesContextsfalse mBinderContextCheckFuncNULL mBinderContextUserDataNULL mThreadPoolStartedfalse mThreadPoolSeq1 if mDriverFD 0 // XXX Ideally there should be a specific define for whether we // have mmap or whether we could possibly have the kernel module // availabla. if definedHAVE_WIN32_IPC
Android系统的Binder机制之二——服务代理对象1 6 / 11 // mmap the binder providing a chunk of virtual address space to receive transactions. mVMStart mmap0 BINDER_VM_SIZE PROT_READ MAP_PRIVATE MAP_NORESERVE mDriverFD 0 if mVMStart MAP_FAILED // sigh LOGEUsing /dev/binder failed: unable to mmap transaction memory.n closemDriverFD mDriverFD -1 else mDriverFD -1 endif if mDriverFD 0 // Need to run without the driver starting our own thread pool. mDriverFD保存了/dev/binder设备的句柄如果仔细查看ProcessState的
源码会发现这个句柄不会被ProcessState对象使用。
那么保存这个句柄做什么用呢被谁使用呢非常奇怪。
经过查看ProcessState的头文件发现如下代码
Android系统的Binder机制之二——服务代理对象1 7 / 11 friend class IPCThreadState 发现IPCThreadState是ProcessState的友元类那么就可以怀疑这个句柄是被IPCThreadState的对象使用的然后查看代码发现确实如此。
IPCThreadState也是一个singleton的类型一个进程中也只能有一个这样的对象。
我们查看一下它的talkWithDriver函数 ........... if ioctlmProcess-mDriverFD BINDER_WRITE_READ bwr 0 err NO_ERROR else err -errno ........... IPCThreadState通过ioctl系统调用对ProcessState打开的句柄进行读写。
这样我们也可以看出IPCThreadState对象的作用 1、维护当前进程中所有对/dev/binder的读写。
换句话说当前进程通过binder机制进行跨进程调用都是通过IPCThreadState对象来完成的。
Android系统的Binder机制之二——服务代理对象1 8 / 11 2、IPCThreadState也可以理解成/dev/binder设备的封装用户可以不直接通过ioctl来操作binder设备都通过IPCThreadState对象来代理即可。
我们这里可以再深入地聊一下不管是客户端进程和Service进程都是需要用IPCThreadState来和binder设备通讯的。
如果是客户端进程则通过服务代理BpBinder对象调用transact函数该函数作用就是把客户端的请求写入binder设备另一端的Service进程具体请参阅IPCThreadState类的transact方法。
作为Service进程当他完成初始化工作之后他需要他们需要进入循环状态等待客户端的请求Service进程调用它的IPCThreadState对象的joinThreadPool方法开始轮询binder设备等待客户端请求的到来后面我们讨论Service时候会进一步讨论joinThreadPool方法。
有兴趣的朋友可以先通过查看代码来了解joinThreadPool方法。
4、Service代理对象BpBinder 上文关于ProcessState的介绍提到了客户端进程创建的Service代理对象其实就是BpBinder对象。
我们首先了解怎样创建BpBinder对象。
BpBinder::BpBinderint32_t handle : mHandlehandle
Android系统的Binder机制之二——服务代理对象1 9 / 11 mAlive1 mObitsSent0 mObituariesNULL LOGVCreating BpBinder p handle dn this mHandle extendObjectLifetimeOBJECT_LIFETIME_WEAK IPCThreadState::self-incWeakHandlehandle 我们可以看出首先是通过IPCThreadState读写binder设备增加中相应binder句柄上的Service的引用计数。
然后本地保存代理Service的binder句柄mHandle。
客户进程对Service的请求都通过调用BpBinder的transact方法来完成 status_t BpBinder::transact uint32_t code const Parcel data Parcel reply uint32_t flags // Once a binder has died it will never come back to life. if mAlive status_t status IPCThreadState::self-transact mHandle code data reply flags
Android系统的Binder机制之二——服务代理对象1 10 / 11 if status DEAD_OBJECT mAlive 0 return status return DEAD_OBJECT 在transact方法中还是调用客户进程的IPCThreadState对象来完成对相应Service请求。
注意transact方法是同步方法将会挂住客户进程的当前线程直到service把请求处理完成并返回结果。
这时客户进程当前线程的transact方法返回。
5、
Android系统对Binder机制的抽象——IBinder 上面我们讲解了Binder机制比较底层的机制这些机制直接用还是比较麻烦的比如使用binder设备的ioctl需要记住很多ioctl的代码。
Android为了是Binder机制容易使用对Binder机制进行了抽象定义了IBinder接口该接口在C/C和Java层都有定义。
IBinder定义了一套使用Binder机制使用和实现客户程序和服务器的通讯协议。
可以理解如下定义
Android系统的Binder机制之二——服务代理对象1 11 / 11 1、向
Android注册的Service也必须是IBinder继承扩展IBinder接口对象。
后续文章中我们讨论Service的时候我们会介绍到这方面的内容。
2、客户端得到Service代理对象也必须定义成IBinder继承扩展IBinder接口对象。
这也是为什么BpBinder就是继承自IBinder。
3、客户端发送请求给客户端调用接口的Service代理对象IBinder接口的transact方法。
4、
Android系统Binder机制将负责把用户的请求调用Service对象IBinder接口的onTransact方法。
具体实现我们将在以后介绍Service的时候讨论。
本文中我们介绍了C层面的Service代理后续文章我们将介绍Java层面的Service代理。
上一篇:
Android系统的Binder机制之三——服务代理对象(2)
下一篇:
ASP小区停车管理系统(Access)(含录像)