您的位置:华清远见教育科技集团 >> 新闻动态 >> Android资料 >> Android服务管理器守护进程  
 
Android服务管理器守护进程
分享到:

Android的守护进程包括控制台(Console)、Adbd(Android Debug Bridge Daemon)、服务管理器(Service Manager)、挂载守护进程(Mount Daemon)、调试守护进程(Debugger Daemon)、无线接口层守护进程(Ril Daemon)、媒体服务器(Media Server)、播放开机音乐(Bootsound)、Dubs、Hci daemon、Spdtool Hfag(Spdtool为一内存超频工具)、Spdtool Sfag、安装守护进程(Install daemon)、flash-recovery等。守护进程的启动是通过system\core\rootdir\init.rc脚本来启动的。

下面主要介绍下服务管理器守护进程。服务管理器管理着Android应用所需的多媒体服务等核心服务,是Android的灵魂组件,图1-1显示了C++和Java层面的服务管理器类图。

图1-1 服务管理器

在服务管理器中,对各种服务的管理是通过IPC通信进行的,其映射内存大小为128×1024。服务管理器通过binder_become_context_manager()方法将自己变为一个上下文管理器,来中转各进程之间传递的消息。

代码1-1 服务管理器的main函数

int main(int argc, char **argv)
    {
      struct binder_state *bs;
      void *svcmgr=BINDER_SERVICE_MANAGER;
      bs=binder_open(128*1024);
      if (binder_become_context_manager(bs)) {   //设为上下文管理器
        LOGE("cannot become context manager (%s)\n", strerror(errno));
        return -1;
      }
      svcmgr_handle=svcmgr;
      binder_loop(bs, svcmgr_handler);   //进入事件循环,监听消息
      return 0;
    }

IPC通信的底层实现接口位于aurora\msm\msm\drivers\staging\android\ binder.c文件中,关于IPC通信的更多信息,请参考2.4.2节IBinder通信机制。

为了使用基于IPC通信的服务,首先需要将服务注册到服务管理器中。下面是电池状态服务(BatteryStatsService)的注册过程:

public void publish(Context context) {
      mContext=context;
      ServiceManager.addService("batteryinfo", asBinder());   //注册服务
    }

为了获取电池状态信息,需要首先获得电池状态服务句柄,过程如下:

public static IBatteryStats getService() {
      if (sService!=null) {
        return sService;
      }
      IBinder b=ServiceManager.getService("batteryinfo");   //获取服务
      sService=asInterface(b);   //获取句柄
      return sService;
    }

服务管理器在整个系统中是唯一的,对Java代码而言,服务管理器即ServiceManager:: sServiceManager,对底层的原生C++代码而言,服务管理器即gDefaultServiceManager。下面是gDefaultServiceManager的实现:

sp<IServiceManager> defaultServiceManager()
    {
      if (gDefaultServiceManager!=NULL) return gDefaultServiceManager;
      {
        AutoMutex _l(gDefaultServiceManagerLock);
        if (gDefaultServiceManager==NULL) {
          gDefaultServiceManager=interface_cast(
          ProcessState::self()->getContextObject(NULL));
        }
      }
      return gDefaultServiceManager;
    }

首先通过 ProcessState::self()->getContextObject(NULL)创建一个Binder对象,然后通过 interface_cast和IMPLEMENT_META_INTERFACE(ServiceManager,"android.os.Iservice Manager")把Binder对象包装成 IServiceManager对象。原理上等同于创建了一个BpServiceManager对象。

需要说明的是,在IServiceManager对象中,包含了BpServiceManager和BnServiceManager两个内部类,其中BpServiceManager是远程服务管理器对象在本地进程的代理,而BnServiceManager则是一个本地服务管理器对象。

在Froyo中,服务管理器管理的与多媒体相关的服务包括media.audio_flinger、media.player、media.camera、media.audio_policy等。

除注册和获取服务句柄外,服务管理器还提供了检查服务是否存在、列出当前正在运行的服务等支持。关于服务管理器的实现,主要文件为service_manager.c、IServiceManager.cpp、IServiceManager.java、ServiceManager.java、ServiceManagerNative.java等。

 更多相关文章

·Android init.rc脚本语
·Android开机启动过程
·Android进程的生命周期
·Android常用组件生命周期
·Android Resources资源