在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;
}