Android Binder机制源码笔记(2)

134 篇文章 0 订阅
36 篇文章 0 订阅
  1. 一个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()都是其定义的.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值