在init.rc檔案裡,可以看到載入下面的服務:
service servicemanager /system/bin/servicemanager
user system
critical
onrestart restart zygote
onrestart restart media
servicemanager服務的代碼在目錄:
Android-2.0/frameworks/base/cmds/servicemanager
servicemanager服務的作用主要是服務管理,所謂的服務管理其實就是擷取服務、檢查服務、添加服務、枚舉所有服務。服務管理員是一個容器管理器,方便服務添加、調用和刪除。在應用程式層的程式,都向這個服務管理員擷取需要使用的服務,而所有提供服務的程式,都向這個伺服器管理員註冊自己的服務。服務管理員是應用程式與服務溝通的橋樑。
下面來分析一下main函數的代碼如下:
int main(int argc, char **argv)
{
struct binder_state *bs;
void *svcmgr = BINDER_SERVICE_MANAGER;
這行代碼是設定管理員從0開始。
bs = binder_open(128*1024);
這行代碼是調用binder_open函數開啟binder裝置,並分配記憶體空間。
if (binder_become_context_manager(bs)) {
LOGE("cannot become context manager (%s)", strerror(errno));
return -1;
}
調用binder_become_context_manager函數設定本服務作為服務管理員。
svcmgr_handle = svcmgr;
這行代碼是設定服務管理員處理函數。
binder_loop(bs, svcmgr_handler);
這行代碼是讓服務管理員進入迴圈地處理服務相關的命令。
return 0;
}