Android 使用Binder进程间通信时,需要先使用defaultServiceManager方法获取ServiceManager,通过ServiceManager的addService或getService来与Binder驱动程序进行交互。下面分析下defaultServiceManager的实现过程。

先看defaultServiceManager牵扯的所有类的一个类图,里面有各个类对应的路径:

defaultServiceManager的实现是在frameworks\native\libs\binder\IServiceManager.cpp中:

sp<IServiceManager> defaultServiceManager(){    if (gDefaultServiceManager != NULL) return gDefaultServiceManager;    {        AutoMutex _l(gDefaultServiceManagerLock);        while (gDefaultServiceManager == NULL) {            gDefaultServiceManager = interface_cast<IServiceManager>(                ProcessState::self()->getContextObject(NULL));            if (gDefaultServiceManager == NULL)                sleep(1);        }    }    return gDefaultServiceManager;}

从上述代码中可以看出gDefaultServiceManager是使用单例模式,也就是通过interface_cast(ProcessState::self()->getContextObject(NULL));来实现的。

首先看下传入的参数ProcessState::self()->getContextObject(NULL)代表什么,ProcessState的路径是frameworks\native\libs\binder\ProcessState.cpp,

sp<ProcessState> ProcessState::self(){    Mutex::Autolock _l(gProcessMutex);    if (gProcess != NULL) {        return gProcess;    }    gProcess = new ProcessState;    return gProcess;}

ProcessState::self()也是单例模式,第一次进去会实例化一个ProcessState对象,看下构造函数:

ProcessState::ProcessState()    : mDriverFD(open_driver()) //打开Binder驱动,并将文件描述符FD赋给mDriverFD   ......{    if (mDriverFD >= 0) {        // 映射mDriverFD 到内存中        mVMStart = mmap(0, BINDER_VM_SIZE, PROT_READ, MAP_PRIVATE | MAP_NORESERVE, mDriverFD, 0);        if (mVMStart == MAP_FAILED) {            // *sigh*            ALOGE("Using /dev/binder failed: unable to mmap transaction memory.\n");            close(mDriverFD);            mDriverFD = -1;        }    }    LOG_ALWAYS_FATAL_IF(mDriverFD < 0, "Binder driver could not be opened.  Terminating.");}//打开驱动static int open_driver(){    //打开Binder驱动对应的文件,Linux中一切事物皆文件    int fd = open("/dev/binder", O_RDWR | O_CLOEXEC);    if (fd >= 0) {        int vers = 0;        //告诉内核Binder的版本号        status_t result = ioctl(fd, BINDER_VERSION, &vers);        ......        size_t maxThreads = DEFAULT_MAX_BINDER_THREADS; //默认值为15        //告诉内核支持的最大线程数        result = ioctl(fd, BINDER_SET_MAX_THREADS, &maxThreads);        ......    }    return fd;}

ProcessState::self()也就是获取一个持有Binder驱动文件描述符的ProcessState,下面看下其getContextObject(NULL)函数的实现。

sp<IBinder> ProcessState::getContextObject(const sp<IBinder>& /*caller*/){    return getStrongProxyForHandle(0);}sp<IBinder> ProcessState::getStrongProxyForHandle(int32_t handle){    sp<IBinder> result;    AutoMutex _l(mLock);    handle_entry* e = lookupHandleLocked(handle);    if (e != NULL) {            //创建BpBinder对象,handle为0            b = new BpBinder(handle);            e->binder = b;            if (b) e->refs = b->getWeakRefs();            result = b;        } else {           ......        }    }    return result;}

从上述代码可以看出,getContextObject(NULL)函数就是创建一个BpBinder对象,handle为0。
到这里defaultServiceManager = interface_cast(ProcessState::self()->getContextObject(NULL));
= interface_cast(new BpBinder(0));

下面看下interface_cast的实现,其代码在IInterface.h中

template<typename INTERFACE>inline sp interface_cast(const sp& obj){    return INTERFACE::asInterface(obj);}//这是一个模板函数,展开即为:inline sp interface_cast(const sp& obj){    return IServiceManager ::asInterface(obj);}//IServiceManager的asInterface是通过DECLARE_META_INTERFACE(ServiceManager);来声明的,使用的是其父类IInterface的宏定义class IServiceManager : public IInterface{public:    DECLARE_META_INTERFACE(ServiceManager);}#define DECLARE_META_INTERFACE(INTERFACE)    static const android::String16 descriptor;    //声明asInterface函数    static android::sp##INTERFACE> asInterface(             const android::sp& obj);    virtual const android::String16& getInterfaceDescriptor() const;    I##INTERFACE();    virtual ~I##INTERFACE();#define IMPLEMENT_META_INTERFACE(INTERFACE, NAME)......      android::sp##INTERFACE> I##INTERFACE::asInterface(            const android::sp& obj)    {        android::sp##INTERFACE> intr;         if (obj != NULL) {            intr = static_cast##INTERFACE*>(                obj->queryLocalInterface(                         I##INTERFACE::descriptor).get());             if (intr == NULL) {                intr = new Bp##INTERFACE(obj); //展开即为intr = new BpServiceManager(obj);            }        }        return intr;    }//看下BpServiceManager的构造函数,它是将参数new BpBinder(0)传给其父类BpServiceManager(const sp& impl)        : BpInterface(impl){}//将参数继续传给父类template<typename INTERFACE>inline BpInterface::BpInterface(const sp& remote)    : BpRefBase(remote){}//将参数new BpBinder(0)赋给mRemote变量,ServiceManager通过mRemote在Binder中addService或getServiceBpRefBase::BpRefBase(const sp& o)    : mRemote(o.get()), mRefs(NULL), mState(0){    extendObjectLifetime(OBJECT_LIFETIME_WEAK);    if (mRemote) {        mRemote->incStrong(this);           // Removed on first IncStrong().        mRefs = mRemote->createWeak(this);  // Held for our entire lifetime.    }}

根据上述代码可知IServiceManager ::asInterface(obj)即创建一个BpServiceManager对象。

到这里defaultServiceManager = new BpServiceManager(new BpBinder(0));

总结一下,defaultServiceManager就是使用new BpBinder(0)来创建BpServiceManager对象,new BpBinder(0)赋给mRemote变量,当Binder server端调用ServiceManager::addService注册服务时,也就是使用remote()->transact(ADD_SERVICE_TRANSACTION, data, &reply);来与Binder驱动程序进行交互,remote()方法即返回mRemote变量。

remote()函数在BpRefBase类中定义

作者:lb377463323
出处:http://blog.csdn.net/lb377463323
原文链接:http://blog.csdn.net/lb377463323/article/details/78275730
转载请注明出处!

更多相关文章

  1. Android(安卓)反编译资料整理
  2. SpannableString的使用方法
  3. Android中WebView使用html,且实现android和JS的互相调用
  4. android 退出activity 转吖转
  5. 箭头函数的基础使用
  6. 类和 Json对象
  7. NPM 和webpack 的基础使用
  8. Python技巧匿名函数、回调函数和高阶函数
  9. Python list sort方法的具体使用

随机推荐

  1. Android放大镜实现的两种方式
  2. start of WindowManagerService
  3. android系统提供的几种颜色Color
  4. Android(安卓)eMMC Booting
  5. android wpa_supplicant 流程分析
  6. android读取usb设备数据
  7. android之ArrayAdaper应用
  8. android 对话框中的进度条 (ProgressDial
  9. android 判断是否在主线程的方法
  10. Android(安卓)报错 android.view.ViewRoo