在Android系统Binder进程间通信机制中,Service组件和Client组件在使用Service Manager提供的服务之前必须获取Service Manager代理对象,下面从源码中来了解
Main_mediaserver程序获取Service Manager代理对象的过程。
int main(int argc __unused, char** argv) { //获取一个ProcessState实例 sp<ProcessState> proc(ProcessState::self()); //获取Service Manager代理对象 sp<IServiceManager> sm = defaultServiceManager(); }
sp<ProcessState> ProcessState::self() { //单例模式 Mutex::Autolock _l(gProcessMutex); if (gProcess != NULL) { return gProcess; } //创建一个新的ProcessState对象 gProcess = new ProcessState; return gProcess; }
ProcessState::ProcessState() //调用open_driver来打开Binder驱动设备文件 : 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). #if !defined(HAVE_WIN32_IPC) // mmap the binder, providing a chunk of virtual address space to receive transactions. //调用mmap将Binder驱动设备文件映射到进程的地址空间,实际上是请求Binder驱动程序分配内核缓冲区,用作进程间传输数据 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; } #else mDriverFD = -1; #endif } LOG_ALWAYS_FATAL_IF(mDriverFD < 0, "Binder driver could not be opened. Terminating."); }
static int open_driver() { //进程调用open打开设备文件/dev/binder,Binder驱动程序会创建一个binder_process结构体,用来描述一个正在使用Binder进程间通信机制的进程 int fd = open("/dev/binder", O_RDWR); if (fd >= 0) { fcntl(fd, F_SETFD, FD_CLOEXEC); int vers = 0; //使用IO控制命令BINDER_VERSION获取Binder驱动程序版本号 status_t result = ioctl(fd, BINDER_VERSION, &vers); if (result == -1) { ALOGE("Binder ioctl to obtain version failed: %s", strerror(errno)); close(fd); fd = -1; } if (result != 0 || vers != BINDER_CURRENT_PROTOCOL_VERSION) { ALOGE("Binder driver protocol does not match user space protocol!"); close(fd); fd = -1; } size_t maxThreads = 15; //使用IO控制命令BINDER_SET_MAX_THREADS通知Binder驱动程序,最多请求进程创建15个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; }
sp<IServiceManager> defaultServiceManager() { //单例模式 if (gDefaultServiceManager != NULL) return gDefaultServiceManager; { AutoMutex _l(gDefaultServiceManagerLock); while (gDefaultServiceManager == NULL) { //下面这个语句有三个函数调用 //1.ProcessState::self():调用ProcessState类的静态成员函数self获得一个ProcessState对象 //2.->getContextObject(NULL):调用ProcessState对象的成员函数getContextObjecgt创建Binder代理对象 //3.interface_cast<IServiceManager>():调用interface_cast<IServiceManager>将Binder代理对象封装成Service Manager代理对象 gDefaultServiceManager = interface_cast<IServiceManager>( ProcessState::self()->getContextObject(NULL)); if (gDefaultServiceManager == NULL) sleep(1); } } return gDefaultServiceManager; }
sp<IBinder> ProcessState::getContextObject(const sp<IBinder>& /*caller*/) { //参数handler的值为0,表示要创建的Binder代理对象的句柄值是0,也就是要创建的是一个Service Manager代理对象 return getStrongProxyForHandle(0); }
sp<IBinder> ProcessState::getStrongProxyForHandle(int32_t handle) { sp<IBinder> result; AutoMutex _l(mLock); //检查要创建的Binder代理对象的句柄值是否已经存在 handle_entry* e = lookupHandleLocked(handle); if (e != NULL) { // We need to create a new BpBinder if there isn't currently one, OR we // are unable to acquire a weak reference on this current one. See comment // in getWeakProxyForHandle() for more info about this. IBinder* b = e->binder; if (b == NULL || !e->refs->attemptIncWeak(this)) { if (handle == 0) { // Special case for context manager... // The context manager is the only object for which we create // a BpBinder proxy without already holding a reference. // Perform a dummy transaction to ensure the context manager // is registered before we create the first local reference // to it (which will occur when creating the BpBinder). // If a local reference is created for the BpBinder when the // context manager is not present, the driver will fail to // provide a reference to the context manager, but the // driver API does not return status. // // Note that this is not race-free if the context manager // dies while this code runs. // // TODO: add a driver API to wait for context manager, or // stop special casing handle 0 for context manager and add // a driver API to get a handle to the context manager with // proper reference counting. Parcel data; status_t status = IPCThreadState::self()->transact( 0, IBinder::PING_TRANSACTION, data, NULL, 0); if (status == DEAD_OBJECT) return NULL; } //根据句柄值handle创建一个Binder代理对象BpBinder b = new BpBinder(handle); e->binder = b; if (b) e->refs = b->getWeakRefs(); result = b; } else { // This little bit of nastyness is to allow us to add a primary // reference to the remote proxy when this team doesn't have one // but another team is sending the handle to us. result.force_set(b); e->refs->decWeak(this); } } return result; }
ProcessState::handle_entry* ProcessState::lookupHandleLocked(int32_t handle) { const size_t N=mHandleToObject.size(); if (N <= (size_t)handle) { //句柄值不存在,创建新的handle_entry结构体并插入到maHandleToObject中 handle_entry e; e.binder = NULL; e.refs = NULL; status_t err = mHandleToObject.insertAt(e, N, handle+1-N); if (err < NO_ERROR) return NULL; } return &mHandleToObject.editItemAt(handle); }
BpBinder::BpBinder(int32_t handle) : mHandle(handle) , mAlive(1) , mObitsSent(0) , mObituaries(NULL) { ALOGV("Creating BpBinder %p handle %d\n", this, mHandle); extendObjectLifetime(OBJECT_LIFETIME_WEAK); //这里会先通过IPCThreadState::self获取IPCThreadState的实例对象之后调用其成员函数incWeakHandle IPCThreadState::self()->incWeakHandle(handle); }
IPCThreadState* IPCThreadState::self() { //单例模式 if (gHaveTLS) { restart: const pthread_key_t k = gTLS; IPCThreadState* st = (IPCThreadState*)pthread_getspecific(k); if (st) return st; return new IPCThreadState; } if (gShutdown) return NULL; pthread_mutex_lock(&gTLSMutex); if (!gHaveTLS) { if (pthread_key_create(&gTLS, threadDestructor) != 0) { pthread_mutex_unlock(&gTLSMutex); return NULL; } gHaveTLS = true; } pthread_mutex_unlock(&gTLSMutex); goto restart; }
sp<IServiceManager> defaultServiceManager() { //单例模式 if (gDefaultServiceManager != NULL) return gDefaultServiceManager; { AutoMutex _l(gDefaultServiceManagerLock); while (gDefaultServiceManager == NULL) { //下面这个语句有三个函数调用 //1.ProcessState::self():调用ProcessState类的静态成员函数self获得一个ProcessState对象 //2.->getContextObject(NULL):调用ProcessState对象的成员函数getContextObjecgt创建Binder代理对象 //3.interface_cast<IServiceManager>():调用interface_cast<IServiceManager>将Binder代理对象封装成Service Manager代理对象 gDefaultServiceManager = interface_cast<IServiceManager>( ProcessState::self()->getContextObject(NULL)); if (gDefaultServiceManager == NULL) sleep(1); } } return gDefaultServiceManager; }
IMPLEMENT_META_INTERFACE(ServiceManager, "android.os.IServiceManager");
#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(); \ //IMPLEMENT_META_INTERFACE(ServiceManager, "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; \ } //asInterface实现在这里!!!!!!!!!!!!!! android::sp<I##INTERFACE> I##INTERFACE::asInterface( \ const android::sp<android::IBinder>& obj) \ { \ android::sp<I##INTERFACE> intr; \ if (obj != NULL) { //obj指向一个Binder代理对象BpBinder intr = static_cast<I##INTERFACE*>( \ obj->queryLocalInterface( \ I##INTERFACE::descriptor).get()); \ if (intr == NULL) { //创建一个Service Manager代理对象BpServiceManager,并把它的IServiceManager接口返回给调用者 intr = new Bp##INTERFACE(obj); \ } \ } \ return intr; \ } \ I##INTERFACE::I##INTERFACE() { } \ I##INTERFACE::~I##INTERFACE() { } \
sp<IInterface> IBinder::queryLocalInterface(const String16& /*descriptor*/) { return NULL; }
public: BpServiceManager(const sp<IBinder>& impl) : BpInterface<IServiceManager>(impl) { }
BpRefBase::BpRefBase(const sp<IBinder>& o) //BpBiinder(0)赋值给mRemote,也就是mRemote指向一个BpBinder对象 : 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. } }