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等。