Android Binder机制 - defaultServiceManager()源码分析
2017-10-18 17:52
686 查看
Android 使用Binder进程间通信时,需要先使用defaultServiceManager方法获取ServiceManager,通过ServiceManager的addService或getService来与Binder驱动程序进行交互。下面分析下defaultServiceManager的实现过程。
先看defaultServiceManager牵扯的所有类的一个类图,里面有各个类对应的路径:
defaultServiceManager的实现是在frameworks\native\libs\binder\IServiceManager.cpp中:
从上述代码中可以看出gDefaultServiceManager是使用单例模式,也就是通过
首先看下传入的参数ProcessState::self()->getContextObject(NULL)代表什么,ProcessState的路径是frameworks\native\libs\binder\ProcessState.cpp,
ProcessState::self()也是单例模式,第一次进去会实例化一个ProcessState对象,看下构造函数:
ProcessState::self()也就是获取一个持有Binder驱动文件描述符的ProcessState,下面看下其getContextObject(NULL)函数的实现。
从上述代码可以看出,getContextObject(NULL)函数就是创建一个BpBinder对象,handle为0。
到这里defaultServiceManager = interface_cast(ProcessState::self()->getContextObject(NULL));
= interface_cast(new BpBinder(0));
下面看下interface_cast的实现,其代码在IInterface.h中
根据上述代码可知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
转载请注明出处!
先看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<IServiceManager>(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> interface_cast(const sp<IBinder>& obj) { return INTERFACE::asInterface(obj); } //这是一个模板函数,展开即为: inline sp<IServiceManager > interface_cast(const sp<IBinder>& 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<I##INTERFACE> asInterface( const android::sp<android::IBinder>& obj); virtual const android::String16& getInterfaceDescriptor() const; I##INTERFACE(); virtual ~I##INTERFACE(); #define IMPLEMENT_META_INTERFACE(INTERFACE, NAME) ...... android::sp<I##INTERFACE> I##INTERFACE::asInterface( 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) { intr = new Bp##INTERFACE(obj); //展开即为intr = new BpServiceManager(obj); } } return intr; } //看下BpServiceManager的构造函数,它是将参数new BpBinder(0)传给其父类 BpServiceManager(const sp<IBinder>& impl) : BpInterface<IServiceManager>(impl) { } //将参数继续传给父类 template<typename INTERFACE> inline BpInterface<INTERFACE>::BpInterface(const sp<IBinder>& remote) : BpRefBase(remote) { } //将参数new BpBinder(0)赋给mRemote变量,ServiceManager通过mRemote在Binder中addService或getService BpRefBase::BpRefBase(const sp<IBinder>& 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
转载请注明出处!
相关文章推荐
- Android Binder学习(三)之defaultServiceManager()的分析
- Android Binder机制(四) defaultServiceManager()的实现
- [置顶] Android开发知识(三)Android进程间Binder通信机制的源码分析(上)
- 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路
- android ActivityManagerService 源码分析----Activity管理(二)
- Android 核心分析 之六 -----IPC框架分析 Binder,Service,Service manager
- Binder源码分析之ServiceManager(原)
- Android之AlarmManagerService源码分析
- 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路
- 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路
- android播放器(music player)源码分析1-Service,Binder,ServiceConnection
- Android源码分析之理解Binder通信机制
- 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路
- Android Binder机制浅析之ServiceManager
- Android 源码分析 -- Binder机制
- Android Binder机制(三) ServiceManager守护进程
- 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路
- android ActivityManagerService 源码分析----Activity管理(一)
- android binder 机制 (ServiceManager)
- 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路