概述
获取Service Manager是通过defaultServiceManager()方法来完成,当进程注册服务(addService)或 获取服务(getService)的过程之前,都需要先调用defaultServiceManager()方法来获取gDefaultServiceManager对象。对于gDefaultServiceManager对象,如果存在则直接返回;如果不存在则创建该对象,创建过程包括调用open()打开binder驱动设备,利用mmap()映射内核的地址空间。
流程图
详细UML图解
defaultServiceManager
IServiceManager.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 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; }
|
获取ServiceManager对象采用单例模式,当gDefaultServiceManager存在,则直接返回,否则创建一个新对象。 发现与一般的单例模式不太一样,里面多了一层while循环,这是google在2013年1月Todd Poynor提交的修改。当尝试创建或获取ServiceManager时,ServiceManager可能尚未准备就绪,这时通过sleep 1秒后,循环尝试获取直到成功。gDefaultServiceManager的创建过程,可分解为以下3个步骤:
- ProcessState::self():用于获取ProcessState对象(也是单例模式),每个进程有且只有一个ProcessState对象,存在则直接返回,不存在则创建;
- getContextObject(): 用于获取BpBinder对象,对于handle=0的BpBinder对象,存在则直接返回,不存在才创建;
- interface_cast():用于获取BpServiceManager对象;
获取ProcessState对象
[ProcessState.cpp]
1 2 3 4 5 6 7 8 9 10 11
| sp<ProcessState> ProcessState::self() { Mutex::Autolock _l(gProcessMutex); if (gProcess != NULL) { return gProcess; }
//实例化ProcessState gProcess = new ProcessState; return gProcess; }
|
获得ProcessState对象: 这也是单例模式,从而保证每一个进程只有一个ProcessState对象。其中gProcess和gProcessMutex是保存在Static.cpp类的全局变量。
初始化ProcessState
[-> ProcessState.cpp]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| ProcessState::ProcessState() : mDriverFD(open_driver()) // 打开Binder驱动 , mVMStart(MAP_FAILED) , mThreadCountLock(PTHREAD_MUTEX_INITIALIZER) , mThreadCountDecrement(PTHREAD_COND_INITIALIZER) , mExecutingThreadsCount(0) , mMaxThreads(DEFAULT_MAX_BINDER_THREADS) , mManagesContexts(false) , mBinderContextCheckFunc(NULL) , mBinderContextUserData(NULL) , mThreadPoolStarted(false) , mThreadPoolSeq(1) { if (mDriverFD >= 0) { //采用内存映射函数mmap,给binder分配一块虚拟地址空间,用来接收事务 mVMStart = mmap(0, BINDER_VM_SIZE, PROT_READ, MAP_PRIVATE | MAP_NORESERVE, mDriverFD, 0); if (mVMStart == MAP_FAILED) { close(mDriverFD); //没有足够空间分配给/dev/binder,则关闭驱动 mDriverFD = -1; } } }
|
- ProcessState的单例模式的惟一性,因此一个进程只打开binder设备一次,其中ProcessState的成员变量mDriverFD记录binder驱动的fd,用于访问binder设备。
- *BINDER_VM_SIZE = (110241024) - (4096 2), binder分配的默认内存大小为1M-8k。
- DEFAULT_MAX_BINDER_THREADS = 15,binder默认的最大可并发访问的线程数为16。
open_driver
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| static int open_driver() { // 打开/dev/binder设备,建立与内核的Binder驱动的交互通道 int fd = open("/dev/binder", O_RDWR); if (fd >= 0) { fcntl(fd, F_SETFD, FD_CLOEXEC); int vers = 0; status_t result = ioctl(fd, BINDER_VERSION, &vers); if (result == -1) { close(fd); fd = -1; } if (result != 0 || vers != BINDER_CURRENT_PROTOCOL_VERSION) { close(fd); fd = -1; } size_t maxThreads = DEFAULT_MAX_BINDER_THREADS;
// 通过ioctl设置binder驱动,能支持的最大线程数 result = ioctl(fd, BINDER_SET_MAX_THREADS, &maxThreads); if (result == -1) { ALOGE("Binder ioctl to set max threads failed: %s", strerror(errno)); } } else { ALOGW("Opening '/dev/binder' failed: %s\n", strerror(errno)); } return fd; }
|
open_driver作用是打开/dev/binder设备,设定binder支持的最大线程数。
获取BpBinder对象
[ProcessState.cpp]
1 2 3 4
| sp<IBinder> ProcessState::getContextObject(const sp<IBinder>& /*caller*/) { return getStrongProxyForHandle(0); }
|
获取handle=0的IBinder
getStrongProxyForHandle
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| sp<IBinder> ProcessState::getStrongProxyForHandle(int32_t handle) { sp<IBinder> result;
AutoMutex _l(mLock); //查找handle对应的资源项【见小节3.3】 handle_entry* e = lookupHandleLocked(handle);
if (e != NULL) { IBinder* b = e->binder; if (b == NULL || !e->refs->attemptIncWeak(this)) { if (handle == 0) { Parcel data; //通过ping操作测试binder是否准备就绪 status_t status = IPCThreadState::self()->transact( 0, IBinder::PING_TRANSACTION, data, NULL, 0); if (status == DEAD_OBJECT) return NULL; } //当handle值所对应的IBinder不存在或弱引用无效时,则创建BpBinder对象 b = new BpBinder(handle); e->binder = b; if (b) e->refs = b->getWeakRefs(); result = b; } else { result.force_set(b); e->refs->decWeak(this); } } return result; }
|
当handle值所对应的IBinder不存在或弱引用无效时会创建BpBinder,否则直接获取。 针对handle==0的特殊情况,通过PING_TRANSACTION来判断是否准备就绪。如果在context manager还未生效前,一个BpBinder的本地引用就已经被创建,那么驱动将无法提供context manager的引用。
获取BpServiceManager
interface_cast
[-> IInterface.h]
1 2 3 4 5
| template<typename INTERFACE> inline sp<INTERFACE> interface_cast(const sp<IBinder>& obj) { return INTERFACE::asInterface(obj); }
|
这是一个模板函数,可得出,interface_cast() 等价于 **IServiceManager::asInterface()**。接下来,再来说说asInterface()函数的具体功能。
IServiceManager::asInterface
对于asInterface()函数,通过搜索代码,你会发现根本找不到这个方法是在哪里定义这个函数的, 其实是通过模板函数来定义的,通过下面两个代码完成的:
1 2 3 4
| //位于IServiceManager.h文件 DECLARE_META_INTERFACE(ServiceManager) //位于IServiceManager.cpp文件 IMPLEMENT_META_INTERFACE(ServiceManager,"android.os.IServiceManager")
|
[-> IServiceManager.h]
1 2 3 4 5 6 7 8
| static const android::String16 descriptor;
static android::sp< IServiceManager > asInterface(const android::sp<android::IBinder>& obj)
virtual const android::String16& getInterfaceDescriptor() const;
IServiceManager (); virtual ~IServiceManager();
|
[-> IServiceManager.cpp]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| const android::String16 IServiceManager::descriptor(“android.os.IServiceManager”);
const android::String16& IServiceManager::getInterfaceDescriptor() const { return IServiceManager::descriptor; }
android::sp<IServiceManager> IServiceManager::asInterface(const android::sp<android::IBinder>& obj) { android::sp<IServiceManager> intr; if(obj != NULL) { intr = static_cast<IServiceManager *>( obj->queryLocalInterface(IServiceManager::descriptor).get()); if (intr == NULL) { intr = new BpServiceManager(obj); } } return intr; }
IServiceManager::IServiceManager () { } IServiceManager::~ IServiceManager() { }
|
不难发现,IServiceManager::asInterface() 等价于 new BpServiceManager()。在这里,更确切地说应该是new BpServiceManager(BpBinder)。
BpServiceManager实例化
创建BpServiceManager对象的过程,会先初始化父类对象:
>BpServiceManager初始化
1 2 3
| BpServiceManager(const sp<IBinder>& impl) : BpInterface<IServiceManager>(impl) { }
|
BpInterface初始化
1 2 3
| inline BpInterface<INTERFACE>::BpInterface(const sp<IBinder>& remote) :BpRefBase(remote) { }
|
BpRefBase初始化
1 2 3 4 5 6 7 8 9 10
| BpRefBase::BpRefBase(const sp<IBinder>& o) : mRemote(o.get()), mRefs(NULL), mState(0) { extendObjectLifetime(OBJECT_LIFETIME_WEAK);
if (mRemote) { mRemote->incStrong(this); mRefs = mRemote->createWeak(this); } }
|
**new BpServiceManager()**,在初始化过程中,比较重要工作的是类BpRefBase的mRemote指向new BpBinder(0),从而BpServiceManager能够利用Binder进行通过通信。
总结
defaultServiceManager 等价于 new BpServiceManager(new BpBinder(0));
ProcessState::self()主要工作:
- 调用open(),打开/dev/binder驱动设备;
- 再利用mmap(),创建大小为1M-8K的内存地址空间;
- 设定当前进程最大的最大并发Binder线程个数为16。
BpServiceManager巧妙将通信层与业务层逻辑合为一体,
- 通过继承接口IServiceManager实现了接口中的业务逻辑函数;
- 通过成员变量mRemote= new BpBinder(0)进行Binder通信工作。
- BpBinder通过handler来指向所对应BBinder, 在整个Binder系统中handle=0代表ServiceManager所对应的BBinder。
感谢:
http://gityuan.com/2015/11/08/binder-get-sm/