SystemServer的程序名叫“system_server”
SystemServer的建立:
systemServer是由Zygote通過Zygote.forkSystemServer函數來fork誕生出來的。
SystemServer的重要使命.
SS(SystemServer)誕生後,便和Zygote分裂了。它有自己的使命:
SS調用handleSystemServerProcess來承擔自己的職責。
現在SS走到了RuntimeInit中。代碼在RuntimeInit.java中,如下所示:
上面有兩個關鍵點:
1. zygoteInitNative分析:
它是一個native函數,實作在AndroidRuntime.cpp中
由于SS是從zygote fork出來的,是以它也擁有zygote程序中定義的這個gCurRuntime,也就是AppRuntime對象。那麼,它的onZygoteInit會幹些什麼呢?
代碼如下:
SS調用zygoteInitNative後,将與Binder通信系統建立聯系,這樣SS就能夠使用Binder了。(Binder第6章介紹)
2. invokeStaticMain分析,第二個關鍵點
這裡invokeStaticMain抛出了一個異常,它是在ZygoteInit的main函數中被截獲:
抛出這個異常最後會導緻com.android.server.SystemServer類的main函數被調用。為什麼不直接調用,而是采用抛異常的方法?
SystemServer的真面目:
ZygoteInit分裂産生SS,其實就是為了調用com.android.server.SysteServer的main函數。下面看看這個真實的main函數:
其中main函數将加載libandroid_server.so庫
init1分析
init1是native函數,在com_android_server_SystemServer.cpp中實作:
system_init的實作在system_init.cpp中,它的代碼如下所示:
init1函數建立了一些系統服務,然後把調用線程加入到了Binder通信中。不過其間還通過JNI調用了com.android.server.SystemServer類的init2函數。
啟動了一個ServerThread線程,直接看它的run函數。
init2就是單獨建立一個線程,用以啟動系統的各項服務。Java世界的核心Server都在這裡啟動,是以它非常重要
SystemServer的總結: