1.我们先来看一下ProcessState.h文件对ProcessState类的声明:
class IPCThreadState; class ProcessState : public virtual RefBase { public: static sp<ProcessState> self(); void setContextObject(const sp<IBinder>& object); sp<IBinder> getContextObject(const sp<IBinder>& caller); void setContextObject(const sp<IBinder>& object, const String16& name); sp<IBinder> getContextObject(const String16& name, const sp<IBinder>& caller); void startThreadPool(); typedef bool (*context_check_func)(const String16& name, const sp<IBinder>& caller, void* userData); bool isContextManager(void) const; bool becomeContextManager( context_check_func checkFunc, void* userData); sp<IBinder> getStrongProxyForHandle(int32_t handle); wp<IBinder> getWeakProxyForHandle(int32_t handle); void expungeHandle(int32_t handle, IBinder* binder); void setArgs(int argc, const char* const argv[]); int getArgC() const; const char* const* getArgV() const; void setArgV0(const char* txt); void spawnPooledThread(bool isMain); private: friend class IPCThreadState; ProcessState(); ~ProcessState(); ProcessState(const ProcessState& o); ProcessState& operator=(const ProcessState& o); struct handle_entry { IBinder* binder; RefBase::weakref_type* refs; }; handle_entry* lookupHandleLocked(int32_t handle); int mDriverFD; void* mVMStart; mutable Mutex mLock; // protects everything below. Vector<handle_entry>mHandleToObject; bool mManagesContexts; context_check_func mBinderContextCheckFunc; void* mBinderContextUserData; KeyedVector<String16, sp<IBinder> > mContexts; String8 mRootDir; bool mThreadPoolStarted; volatile int32_t mThreadPoolSeq; };
我们发现:
1)ProcessState的构造函数ProcessState(),析构函数~ProcessState()都是私有的,也就是说外部不能通过new来创建ProcessState对象。
2)ProcessState声明IPCThreadState是ProcessState的友元类。说白了,IPCThreadState类可以访问ProcessState类的私有成员,方法。
3)ProcessState提供了self()方法,用于实例化ProcessState类。而ProcessState的实例是单实例的。
sp<ProcessState> ProcessState::self() { if (gProcess != NULL) return gProcess; AutoMutex _l(gProcessMutex); if (gProcess == NULL) gProcess = new ProcessState; return gProcess; }
4)来看一下gProcess的定义
gProcess是全局变量, 定义在binder/Static.cpp中:
namespace android { // ------------ ProcessState.cpp Mutex gProcessMutex; sp<ProcessState> gProcess; 。。。 // ------------ ServiceManager.cpp Mutex gDefaultServiceManagerLock; sp<IServiceManager> gDefaultServiceManager; sp<IPermissionController> gPermissionController; } // namespace android
在这个文件里面定义了几个很重要的全局变量:
Mutex gProcessMutex; sp<ProcessState> gProcess; Mutex gDefaultServiceManagerLock; sp<IServiceManager> gDefaultServiceManager; sp<IPermissionController> gPermissionController;
这样我们在同一个进程的任意地方就可以直接使用这几个变量了
2.我们来看一下ProcessState的构造函数
ProcessState::ProcessState() : mDriverFD(open_driver()) , mVMStart(MAP_FAILED) , mManagesContexts(false) , mBinderContextCheckFunc(NULL) , mBinderContextUserData(NULL) , mThreadPoolStarted(false) , mThreadPoolSeq(1) { if (mDriverFD >= 0) { // XXX Ideally, there should be a specific define for whether we // have mmap (or whether we could possibly have the kernel module // availabla). // mmap the binder, providing a chunk of virtual address space to receive transactions. mVMStart = mmap(0, BINDER_VM_SIZE, PROT_READ, MAP_PRIVATE | MAP_NORESERVE, mDriverFD, 0); if (mVMStart == MAP_FAILED) { // *sigh* LOGE("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."); }
1)调用open_driver()打开binder设备,并把binder设备的文件描述符保存在mDriverFD
static int open_driver() { int fd = open("/dev/binder", O_RDWR); if (fd >= 0) { fcntl(fd, F_SETFD, FD_CLOEXEC); int vers; status_t result = ioctl(fd, BINDER_VERSION, &vers); if (result == -1) { LOGE("Binder ioctl to obtain version failed: %s", strerror(errno)); close(fd); fd = -1; } if (result != 0 || vers != BINDER_CURRENT_PROTOCOL_VERSION) { LOGE("Binder driver protocol does not match user space protocol!"); close(fd); fd = -1; } size_t maxThreads = 15; result = ioctl(fd, BINDER_SET_MAX_THREADS, &maxThreads); if (result == -1) { LOGE("Binder ioctl to set max threads failed: %s", strerror(errno)); } } else { LOGW("Opening '/dev/binder' failed: %s\n", strerror(errno)); } return fd; }
2)如果binder设备打开成功,把mDriverFD以只读的方式映射到内存,保存映射的内存地址到mVMStart
mVMStart = mmap(0, BINDER_VM_SIZE, PROT_READ, MAP_PRIVATE | MAP_NORESERVE, mDriverFD, 0);
3.启动线程方法:ProcessState::startThreadPool()
void ProcessState::startThreadPool() { AutoMutex _l(mLock); if (!mThreadPoolStarted) { mThreadPoolStarted = true; spawnPooledThread(true); } }
void ProcessState::spawnPooledThread(bool isMain) { if (mThreadPoolStarted) { int32_t s = android_atomic_add(1, &mThreadPoolSeq); char buf[32]; sprintf(buf, "Binder Thread #%d", s); LOGV("Spawning new pooled thread, name=%s\n", buf); sp<Thread> t = new PoolThread(isMain); t->run(buf); } }
这个需要注意:
外部调用如没有有先调用ProcessState::startThreadPool(),那mThreadPoolStarted == false,这样外部调用ProcessState::spawnPooledThread(bool isMain)就没有办法启动线程池。而调用了ProcessState::startThreadPool(),实际上也会调用到一次ProcessState::spawnPooledThread(bool isMain)。
4)PoolThread类
class PoolThread : public Thread { public: PoolThread(bool isMain) : mIsMain(isMain) { } protected: virtual bool threadLoop() { IPCThreadState::self()->joinThreadPool(mIsMain); return false; } const bool mIsMain; };
PoolThread类继承了Thread类,实现了Thread::threadLoop()方法。这样PoolThread类的实例就可以直接调用run()回调到threadLoop()。
virtual bool threadLoop() { IPCThreadState::self()->joinThreadPool(mIsMain); return false; }
IPCThreadState::joinThreadPool(bool isMain)我们在IPCThreadState博文中进行讲解。