Binder - 获取ServiceManager服务

2022-03-07  本文已影响0人  w达不溜w

当进程注册服务(addService)和获取服务(getService)时,都需要先调用defaultServiceManager()方法来获取ServiceManager服务

//资源路径:/frameworks/native/libs/binder/IServiceManager.cpp
sp<IServiceManager> defaultServiceManager()
{
  //单例模式,不为空直接返回
  if (gDefaultServiceManager != NULL) return gDefaultServiceManager;
  {
    AutoMutex _l(gDefaultServiceManagerLock);
    //当尝试获取SM时,SM可能为准备就绪,这时通过sleep 1秒后,循环尝试获取直到成功
    while (gDefaultServiceManager == NULL) {
      //SM的创建过程,可以分为3个步骤
      gDefaultServiceManager = interface_cast<IServiceManager>(
        ProcessState::self()->getContextObject(NULL));
      if (gDefaultServiceManager == NULL)
        sleep(1);
    }
  }
  return gDefaultServiceManager;
}

①ProcessState::self() 获取ProcessState对象

1)打开驱动;2)设置线程最大数15;3)mmap,分配大小为1M-8k内存地址空间

//资源路径:/frameworks/native/libs/binder/ProcessState.cpp
sp<ProcessState> ProcessState::self()
{
  //单例模式,不为空直接返回
  if (gProcess != NULL) {
    return gProcess;
  }
  //实例化ProcessState
  gProcess = new ProcessState;
  return gProcess;
}

#define BINDER_VM_SIZE ((1*1024*1024) - (4096 *2))
#define DEFAULT_MAX_BINDER_THREADS 15

ProcessState::ProcessState()
  : mDriverFD(open_driver())
{
    // mmap the binder, providing a chunk of virtual address space to receive transactions.
    //通过内存映射,给binder分配一块大小为(1M-8k)的虚拟地址空间,用来接收事务
    mVMStart = mmap(0, BINDER_VM_SIZE, PROT_READ, MAP_PRIVATE | MAP_NORESERVE, mDriverFD, 0);
}

static int open_driver()
{
  //打开/dev/binder设备,建立与内核的Binder驱动的交互通道
  int fd = open("/dev/binder", O_RDWR);
  //设置最大能支持的线程数为15
  size_t maxThreads = DEFAULT_MAX_BINDER_THREADS;
  //通过ioctl设置binder驱动能支持的最大线程数
  result = ioctl(fd, BINDER_SET_MAX_THREADS, &maxThreads);
}

②ProcessState::getContextObject 创建BpBinder对象

1)创建一个BpBinder(SM的代理对象)

//资源路径:/frameworks/native/libs/binder/ProcessState.cpp
sp<IBinder> ProcessState::getContextObject(const sp<IBinder>& /*caller*/)
{
  //参数为0,获取SM服务
  return getStrongProxyForHandle(0);
}

sp<IBinder> ProcessState::getStrongProxyForHandle(int32_t handle)
{
  //查找handle对应的资源项
  handle_entry* e = lookupHandleLocked(handle);
  if (b == NULL || !e->refs->attemptIncWeak(this)) {
    if (handle == 0) {
      //handle为0时,通过PING_TRANSACTION看SM进程是否能访问(ping操作测试binder是否准备就绪)
      status_t status = IPCThreadState::self()->transact(
                        0, IBinder::PING_TRANSACTION, data, NULL, 0);
    }
    //当handle值对应的IBinder不存在或弱引用无效时,创建BpBinder对象
    b = new BpBinder(handle);
  }
}

③interface_cast 获取BpServiceManager

//资源路径:/frameworks/native/include/binder/IInterface.h
template<typename INTERFACE>
inline sp<INTERFACE> interface_cast(const sp<IBinder>& obj)
{
  //泛型,等价于 IServiceManager::asInterface
  //IServiceManager中找不到asInterface函数,是通过模板函数来定义的
  return INTERFACE::asInterface(obj);
}
//资源路径:/frameworks/native/include/binder/IServiceManager.h
IMPLEMENT_META_INTERFACE(ServiceManager, "android.os.IServiceManager");
//资源路径:/frameworks/native/include/binder/IInterface.h
//INTERFACE替换成ServiceManager,NAME替换成"android.os.IServiceManager"
#define IMPLEMENT_META_INTERFACE(INTERFACE, NAME)                       
    const android::String16 I##INTERFACE::descriptor(NAME);             
    const android::String16&                                            
            I##INTERFACE::getInterfaceDescriptor() const {              
        return I##INTERFACE::descriptor;                               
    }                                                                   
    android::sp<I##INTERFACE> I##INTERFACE::asInterface(   
                //obj是传来的BpBinder
            const android::sp<android::IBinder>& obj)                   
    {                                                                   
        android::sp<I##INTERFACE> intr;                                 
        if (obj != NULL) {                                              
            intr = static_cast<I##INTERFACE*>(                          
                obj->queryLocalInterface(                               
                        I##INTERFACE::descriptor).get());               
            if (intr == NULL) {     
                //等价于new BpServiceManager(BpBinder)
                intr = new Bp##INTERFACE(obj);                          
            }                                                           
        }                                                               
        return intr;                                                    
    }                                                                   
    I##INTERFACE::I##INTERFACE() { }                                    
    I##INTERFACE::~I##INTERFACE() { }

BpServiceManager

//资源路径:/frameworks/native/libs/binder/IServiceManager.cpp
class BpServiceManager : public BpInterface<IServiceManager>
{
  public:
    BpServiceManager(const sp<IBinder>& impl)
        : BpInterface<IServiceManager>(impl)
}
//资源路径:/frameworks/native/include/binder/IInterface.h
template<typename INTERFACE>
inline BpInterface<INTERFACE>::BpInterface(const sp<IBinder>& remote)
    : BpRefBase(remote)
//资源路径:/frameworks/native/libs/binder/Binder.cpp
//mRemote指向new BpBinder(0),从而BpServiceManager能够利用Binder进行通信
BpRefBase::BpRefBase(const sp<IBinder>& o)
   : mRemote(o.get()), mRefs(NULL), mState(0)

获取ServiceManager服务 => defaultServiceManager => new BpServiceManager(new BpBinder(0))
BpServiceManager为客户端代理对象,封装服务要用的接口和方法
BpBinder为ServiceManager代理对象,具有跨进程的能力

上一篇下一篇

猜你喜欢

热点阅读