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()方法將自己變?yōu)橐粋上下文管理器,來中轉各進程之間傳遞的消息。
代碼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); //進入事件循環(huán),監(jiān)聽消息
return 0;
}
IPC通信的底層實現接口位于aurora\msm\msm\drivers\staging\android\ binder.c文件中,關于IPC通信的更多信息,請參考2.4.2節(jié)IBinder通信機制。
為了使用基于IPC通信的服務,首先需要將服務注冊到服務管理器中。下面是電池狀態(tài)服務(BatteryStatsService)的注冊過程:
public void publish(Context context) {
mContext=context;
ServiceManager.addService("batteryinfo", asBinder()); //注冊服務
}
為了獲取電池狀態(tài)信息,需要首先獲得電池狀態(tài)服務句柄,過程如下:
public static IBatteryStats getService() {
if (sService!=null) {
return sService;
}
IBinder b=ServiceManager.getService("batteryinfo"); //獲取服務
sService=asInterface(b); //獲取句柄
return sService;
}
服務管理器在整個系統(tǒng)中是唯一的,對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)創(chuàng)建一個Binder對象,然后通過 interface_cast和IMPLEMENT_META_INTERFACE(ServiceManager,"android.os.Iservice Manager")把Binder對象包裝成 IServiceManager對象。原理上等同于創(chuàng)建了一個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等。