`

Android Binder进程间通信-ServiceManager代理对象的获取过程

 
阅读更多

文章来源:http://www.itnose.net/detail/6043249.html
更多文章:http://www.itnose.net/type/85.html

一、测试代码:

       ~/Android/external/binder/server

        ----FregServer.cpp

        ~/Android/external/binder/common

        ----IFregService.cpp

        ----IFregService.h

       ~/Android/external/binder/client

       ----FregClient.cpp

 

       Binder库(libbinder)代码:

       ~/Android/frameworks/base/libs/binder

       ----BpBinder.cpp

       ----Parcel.cpp

       ----ProcessState.cpp

       ----Binder.cpp

       ----IInterface.cpp

       ----IPCThreadState.cpp

       ----IServiceManager.cpp

       ----Static.cpp

       ~/Android/frameworks/base/include/binder

       ----Binder.h

       ----BpBinder.h

       ----IInterface.h

       ----IPCThreadState.h

       ----IServiceManager.h

       ----IBinder.h

       ----Parcel.h

       ----ProcessState.h

 

        驱动层代码:

       ~/Android//kernel/goldfish/drivers/staging/android

       ----binder.c

       ----binder.h

 

二、源码分析

      1、程序首先开始从Service进程FregServer.cpp的main函数开始执行

     ~/Android/external/binder/server

     ----FregServer.cpp

 

class FregService : public BnFregService
{
        ...........
public:
	static void instantiate()
	{
		defaultServiceManager()->addService(String16(FREG_SERVICE), new FregService());
	}
        ...........
};

int main(int argc, char** argv)
{
	FregService::instantiate();

	ProcessState::self()->startThreadPool();
	IPCThreadState::self()->joinThreadPool();

	return 0;
}
      main函数首先调用静态方法instantiate,在instantiate中调用了defaultServiceManager(), defaultServiceManager()函数实现如下:

 

     

      ~/Android/frameworks/base/libs/binder

      ----IServiceManager.cpp

 

sp<IServiceManager> defaultServiceManager()
{
    if (gDefaultServiceManager != NULL) return gDefaultServiceManager;//如果已经创建了代理对象,那么就直接返回
    
    {
        AutoMutex _l(gDefaultServiceManagerLock);//使用锁,来实现单例模式
        if (gDefaultServiceManager == NULL) {
            gDefaultServiceManager = interface_cast<IServiceManager>(//分三步获取Service Manager代理对象
                ProcessState::self()->getContextObject(NULL));
        }
    }
    
    return gDefaultServiceManager;
}
      其中gDefaultServiceManagerLock,gDefaultServiceManager都定义在Static.cpp中。

 

       ~/Android/frameworks/base/libs/binder

       ----Static.cpp

 

Mutex gDefaultServiceManagerLock;   //锁
sp<IServiceManager> gDefaultServiceManager; //IServiceManager的强指针
       全局变量 gDefaultServiceManager是一个类型为IServiceManager的强指针,它指向进程内的一个BpServiceManager对象,即Service Manager代理对象;而全局变量gDefaultServiceManagerLock是用来保证一个进程至多只有一个Service Manager代理对象。结合锁机制来保证对象在进程中的唯一性,这是单例设计模式的经典实现。

 

       如果已经创建了代理对象,那么就直接返回。如果没有创建,那么分三步创建:

       (1)、调用ProcessState类的静态成员函数self获取进程内的一个ProcessState对象。

       (2)、调用前面获得的ProcessState对象的成员函数getContextObject创建一个Binder代理对象

       (3)、调用模板函数interface_cast<IServiceManager>将前面获得的Binder代理对象封装成一个Service Manager代理对象。

 

        2、调用ProcessState类的静态成员函数self获取进程内的一个ProcessState对象

       ~/Android/frameworks/base/libs/binder

       ----ProcessState.cpp

 

sp<ProcessState> ProcessState::self()
{
    if (gProcess != NULL) return gProcess;//如果已经创建了,就直接返回
    
    AutoMutex _l(gProcessMutex);
    if (gProcess == NULL) gProcess = new ProcessState;//创建ProcessState对象
    return gProcess;
}
      其中gProcess,gProcessMutex都位于Static.cpp中

 

 

Mutex gProcessMutex;
sp<ProcessState> gProcess;
      全局变量gProcess是一个类型为ProcessState的强指针,它指向进程内的一个ProcessState对象;而全局变量gProcessMutex是一个互斥锁,是用来保证一个进程至多只有一个ProcessState对象的,同样是一个单例模式。

 

 

      首次进入,故创建ProcessState对象。

 

      ~/Android/frameworks/base/libs/binder

      ----ProcessState.cpp

 

ProcessState::ProcessState()
    : mDriverFD(open_driver())
    , mVMStart(MAP_FAILED)
    .....
{
    if (mDriverFD >= 0) {
       ...........
        // 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);
       ...........
}
     在初始化构造函数中调用了open_driver方法。

 

      ~/Android/frameworks/base/libs/binder

      ----ProcessState.cpp

 

static int open_driver()
{
    if (gSingleProcess) {
        return -1;
    }

    int fd = open("/dev/binder", O_RDWR);//又一个进程打开了设备文件,binder_procs又多了一个进程的结构体
    if (fd >= 0) {
        fcntl(fd, F_SETFD, FD_CLOEXEC);
        int vers;
#if defined(HAVE_ANDROID_OS)
        status_t result = ioctl(fd, BINDER_VERSION, &vers);
#else
        status_t result = -1;
        errno = EPERM;
#endif
        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;
        }
#if defined(HAVE_ANDROID_OS)
        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));
        }
#endif
        
    } else {
        LOGW("Opening '/dev/binder' failed: %s\n", strerror(errno));
    }
    return fd;
}
      open_driver首先调用了open打开设备文件,在http://blog.csdn.net/jltxgcy/article/details/25797011这盘文章中已经讲解了驱动层的binder_open所做的事。然后的调用ioctl传入BINDER_VERSION参数来获取vers。最后调用ioctl传入BINDER_SET_MAX_THREADS参数来设备该进程所支持的最大线程数。

 

     

      在初始化列表中调用mmap把设备文件/dev/binder映射到进程的地址空间,其实将/dev/binder映射到进程的地址空间实际上是请求Binder驱动程序为进程分配内核缓冲区。


      3、调用前面获得的ProcessState对象的成员函数getContextObject创建一个Binder代理对象

      ~/Android/frameworks/base/libs/binder

      ----ProcessState.cpp

 

sp<IBinder> ProcessState::getContextObject(const sp<IBinder>& caller)
{
    if (supportsProcesses()) {
        return getStrongProxyForHandle(0);
    } else {
        return getContextObject(String16("default"), caller);
    }
}

 

分享到:
评论

相关推荐

    Android进程间通信-Binder机制详解

    Binder机制是Android独有的IPC方式,它不同于传统的Unix/Linux进程间通信机制,如管道、信号、共享内存等,而是基于OpenBinder实现的分布式组件架构,提供了类似于远程过程调用(RPC)的功能。 **一、Binder机制...

    Android进程间通信-Binder机制

    ### Android进程间通信——Binder机制 #### 一、简要介绍和学习计划 在Android操作系统中,每一个应用程序通常由多个组件如Activity和服务(Service)组成。这些组件可能运行在同一进程中,也可能分布在不同进程中。...

    Binder与进程间通信

    Binder机制是Android系统中实现进程间通信(Inter-Process Communication, IPC)的核心架构之一。它采用客户端/服务器(Client/Server, C/S)架构,允许不同进程之间共享数据和服务。在Android系统中,Binder作为...

    Android之Binder与进程间通信.[归类].pdf

    Android系统采用了一种特殊的进程间通信(IPC)机制,称为Binder。在Android开发中,Binder充当客户端和服务器之间通信的桥梁,使得应用程序可以访问系统服务或实现自己的服务供其他应用程序使用。以下是关于Android...

    Android Binder机制完全解析

    在Android系统中,Binder是实现进程间通信(IPC,Inter-Process Communication)的关键技术,它是Android系统服务和应用程序之间交互的主要方式。深入理解Binder机制对于Android应用开发尤其是系统级服务开发至关...

    Android进程间通信(IPC)机制Binder守护进程之路

    ### Android进程间通信(IPC)机制Binder守护进程之路 #### 一、概述 在上一篇文章中,我们简要介绍了Android系统中的进程间通信(IPC)机制Binder及其整体架构。Binder机制由四大核心组件构成:客户端(Client)、...

    Android中Binder处理流程

    在Android系统中,Binder是实现进程间通信(IPC,Inter-Process Communication)的核心组件,它使得不同进程间的对象可以透明地调用对方的方法,从而打破了Android应用之间默认的沙箱隔离。下面我们将深入探讨...

    Android底层源码分析_Binder

    Binder是Android系统中实现进程间通信(IPC)的核心机制之一。其设计模式基于客户端-服务器(Client-Server)架构,其中提供服务的一方称为Server进程,请求服务的一方称为Client进程。 **服务组件与客户端组件**:...

    Android系统的Binder机制之三——服务代理对象(2).docx

    在Android系统中,Binder机制是实现进程间通信(IPC,Inter-Process Communication)的核心组件。在上一部分我们探讨了C/C++层面的服务代理对象BpBinder以及Binder底层处理方式。现在我们将深入研究Java层面上服务...

    Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析[归纳].pdf

    在Android系统中,Binder机制是实现进程间通信(IPC,Inter-Process Communication)的核心组件。它允许不同进程之间的对象和数据共享,使得Android组件如服务(Service)、活动(Activity)等能够跨越进程边界进行...

    android binder架构

    Android Binder架构是Android系统中用于进程间通信(IPC)的一种机制,其设计目的是为了提供一种高效的、稳定的方式在不同的进程之间传输数据。Binder架构由一个轻量级的远程过程调用(RPC)机制实现,它将数据封装成...

    android 的binder机制在java、c++层的实现

    Android的Binder机制是其独特的进程间通信(IPC)方式,主要负责Android系统中服务与服务、应用与服务之间的通信。本文将深入解析Binder在Java层和C++层的实现,并通过一个简单的模拟示例来阐述如何在不同进程中进行...

    android aidl进程间通信

    在Android系统中,AIDL(Android Interface Definition Language)是一种用于实现进程间通信(IPC, Inter-Process Communication)的机制。AIDL允许一个应用服务在不同的进程中运行,使得其他应用能够与之交互,共享...

    Android系统中基于Binder的IPC流程框架分析

    以上内容是对“Android系统中基于Binder的IPC流程框架分析”文档的知识点总结,详细涵盖了Binder进程间通信机制、BinderDriver、ServiceManager、Service组件以及Client组件等关键部分,并对它们在Binder IPC框架中...

    Android系统的Binder机制之一——Service_Manager

    Android系统基于Linux内核,但在进程间通信(IPC)方面并没有采用传统的Linux IPC机制,而是设计并实现了自己的一套轻量级IPC解决方案——Binder机制。该机制不仅提供了高效的进程间通信能力,还为Android框架层提供...

    android Binder 分析

    在Android系统中,Binder是核心的进程间通信(IPC,Inter-Process Communication)机制,它使得不同进程之间的数据交换和方法调用成为可能。Android的Binder机制与其他IPC方式如管道、信号、消息队列、共享内存、套...

    binder通信实例

    在Android系统中,Binder是实现进程间通信(IPC,Inter-Process Communication)的主要机制,它是一种基于消息传递的通信方式,允许不同进程间的对象互相调用方法,仿佛它们是在同一个进程中一样。本教程将深入探讨...

    mDemo-Binder机制学习

    在Android系统中,Binder是实现进程间通信(IPC,Inter-Process Communication)的核心组件,它是一种接口机制,允许不同进程间的对象互相调用方法。在Android应用开发中,理解并熟练掌握Binder机制对于优化性能、...

Global site tag (gtag.js) - Google Analytics