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