Binder - 獲取ServiceManager服務(wù)

當(dāng)進(jìn)程注冊(cè)服務(wù)(addService)和獲取服務(wù)(getService)時(shí),都需要先調(diào)用defaultServiceManager()方法來(lái)獲取ServiceManager服務(wù)

//資源路徑:/frameworks/native/libs/binder/IServiceManager.cpp
sp<IServiceManager> defaultServiceManager()
{
  //單例模式,不為空直接返回
  if (gDefaultServiceManager != NULL) return gDefaultServiceManager;
  {
    AutoMutex _l(gDefaultServiceManagerLock);
    //當(dāng)嘗試獲取SM時(shí),SM可能為準(zhǔn)備就緒,這時(shí)通過(guò)sleep 1秒后,循環(huán)嘗試獲取直到成功
    while (gDefaultServiceManager == NULL) {
      //SM的創(chuàng)建過(guò)程,可以分為3個(gè)步驟
      gDefaultServiceManager = interface_cast<IServiceManager>(
        ProcessState::self()->getContextObject(NULL));
      if (gDefaultServiceManager == NULL)
        sleep(1);
    }
  }
  return gDefaultServiceManager;
}

①ProcessState::self() 獲取ProcessState對(duì)象

1)打開(kāi)驅(qū)動(dòng);2)設(shè)置線程最大數(shù)15;3)mmap,分配大小為1M-8k內(nèi)存地址空間

//資源路徑:/frameworks/native/libs/binder/ProcessState.cpp
sp<ProcessState> ProcessState::self()
{
  //單例模式,不為空直接返回
  if (gProcess != NULL) {
    return gProcess;
  }
  //實(shí)例化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.
    //通過(guò)內(nèi)存映射,給binder分配一塊大小為(1M-8k)的虛擬地址空間,用來(lái)接收事務(wù)
    mVMStart = mmap(0, BINDER_VM_SIZE, PROT_READ, MAP_PRIVATE | MAP_NORESERVE, mDriverFD, 0);
}

static int open_driver()
{
  //打開(kāi)/dev/binder設(shè)備,建立與內(nèi)核的Binder驅(qū)動(dòng)的交互通道
  int fd = open("/dev/binder", O_RDWR);
  //設(shè)置最大能支持的線程數(shù)為15
  size_t maxThreads = DEFAULT_MAX_BINDER_THREADS;
  //通過(guò)ioctl設(shè)置binder驅(qū)動(dòng)能支持的最大線程數(shù)
  result = ioctl(fd, BINDER_SET_MAX_THREADS, &maxThreads);
}

②ProcessState::getContextObject 創(chuàng)建BpBinder對(duì)象

1)創(chuàng)建一個(gè)BpBinder(SM的代理對(duì)象)

//資源路徑:/frameworks/native/libs/binder/ProcessState.cpp
sp<IBinder> ProcessState::getContextObject(const sp<IBinder>& /*caller*/)
{
  //參數(shù)為0,獲取SM服務(wù)
  return getStrongProxyForHandle(0);
}

sp<IBinder> ProcessState::getStrongProxyForHandle(int32_t handle)
{
  //查找handle對(duì)應(yīng)的資源項(xiàng)
  handle_entry* e = lookupHandleLocked(handle);
  if (b == NULL || !e->refs->attemptIncWeak(this)) {
    if (handle == 0) {
      //handle為0時(shí),通過(guò)PING_TRANSACTION看SM進(jìn)程是否能訪問(wèn)(ping操作測(cè)試binder是否準(zhǔn)備就緒)
      status_t status = IPCThreadState::self()->transact(
                        0, IBinder::PING_TRANSACTION, data, NULL, 0);
    }
    //當(dāng)handle值對(duì)應(yīng)的IBinder不存在或弱引用無(wú)效時(shí),創(chuàng)建BpBinder對(duì)象
    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)
{
  //泛型,等價(jià)于 IServiceManager::asInterface
  //IServiceManager中找不到asInterface函數(shù),是通過(guò)模板函數(shù)來(lái)定義的
  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是傳來(lái)的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) {     
                //等價(jià)于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),從而B(niǎo)pServiceManager能夠利用Binder進(jìn)行通信
BpRefBase::BpRefBase(const sp<IBinder>& o)
   : mRemote(o.get()), mRefs(NULL), mState(0)

獲取ServiceManager服務(wù) => defaultServiceManager => new BpServiceManager(new BpBinder(0))
BpServiceManager為客戶端代理對(duì)象,封裝服務(wù)要用的接口和方法
BpBinder為ServiceManager代理對(duì)象,具有跨進(jìn)程的能力

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容