- 一个Client要获得想要通信的Service的handle,必须先借助于ServiceManager来获得想要的service的handle, 所以第一步是和ServiceManager这个service通信,而serviceManader其handle固定为0,因此在IServiceManager.cpp的defaultServiceManager()就可以获得:
- 可以看到defaultServiceManager()维护了一个static全局对象gDefaultServiceManager,只会初始化一次,第一次获得时,会调用当前进程的ProcessState::self()->getContextObject(NULL))得到一个IBinder对象并interface_cast为一个IServiceManager对象.
- 而ProcessState::getContextObject(…)调用的是getStrongProxyForHandle(0这个0就是ServiceManager的handler值)
- getStrongProxyForHandle(handle)本身则是一个可以根据handle值获得联通了对应这个handle已经注册Service的BpBinder.
- 上面的超找handle对应的BpBinder是通过ProcessState的lookupHandleLocked(handle)函数得到的: ProcessState内部会维护一个本进程已经存在的BpBinder的vector(注意这个Vector是KeyedVector, ): mHandleToObject,handle_entry结构中有一个IBinder* 和 weakref_type*.
- 如果已经有,则返回,否则在Vector中插入一个新成员,并new相应的BpBinder保存在此新成员中供下次使用.
- 在得到了可以和ServiceManager通信的BpBinder以后,会通过interface_cast(IInterface.h中定义)template typename INTERFACE, INTERFACE::asInterface(obj)来进一步进行转化,这里其实调用的是IServiceManager的asInterface,而定义则是在IServiceManager.cpp的IMPLEMENT_META_INTERFACE(ServiceManager, “android.os.IServiceManager”)宏中(在binder/IInterface.h中定义), 很难找. 这个宏最后会把BpBinder转化为一个BpServiceManager.
- 那么client实际得到的就是一个handle为0的BpServiceManager.
- 得到的BpServiceManager带有一个’p’,代表的是proxy的意思,这就表明其很多方法其实是远程调用实现的, 而代码也验证了这一点:
- virtual sp getService(const String16& name): 这个函数就是根据给出的service的名称得到一个可以与此service通信的Binder指针(应该指向的也是一个proxy), 这个函数会尝试去获取5次这个service,间隔1s, 如果5次都拿不到,那么返回null
- virtual sp checkService( const String16& name)才是真正向远端获取binder的实现, 其实现也很见,就是在一个Parcel填入IServiceManager::getInterfaceDescriptor()和Service的名称,然后调用remote()的transact方法同步等待返回,最后在返回的结果中readStrongBinder(),就得到了可以通信的binder
- 还有addService和listServices(),也都是通过remote()的transact(…)实现的.
- BpInterface的定义在binder/IInterface.h中:
- BpInterface中的remote方法继承自BpRefBase, 返回的是BpRefBase的IBinder* const mRemote,
- mRemote的赋值则是在BpInterface的初始化列表中就被设定了,外界传入, 就是传入构造函数的参数. 进一步就是BpServiceManager在构造时被传入的构造参数.
- 而BpServiceManager的构造则是在IMPLEMENT_META_INTERFACE这个宏中定义的asInterface(…)函数中new出来的,传入的参数则是asInterface()被调用时传入的参数
- 继续,asInterface(…)则是在IInterface.h中的内联函数interface_cast(…)调用的,后者传递了该参数给asInterface(…).
- 继续跟interface_cast(…), 在IServiceManager.cpp中的defaultServiceManager()会调用它,传入的参数则是之前分析过的ProcessState::self()->getContextObject(NULL), 是一个可以于ServiceManager通信的Ibinder.
- 所有BpServiceManager中remote()得到的就是一个可以和ServiceManager通信的binder,因此可以用它来获取/添加service
- BpRefBase则是在binder/Binder.h中定义, mRemote/remote()都是其定义的.