天天看點

SystemService

SystemServer的程序名叫“system_server”

SystemServer的建立:

SystemService

systemServer是由Zygote通過Zygote.forkSystemServer函數來fork誕生出來的。

SystemServer的重要使命.

SS(SystemServer)誕生後,便和Zygote分裂了。它有自己的使命:

SystemService

SS調用handleSystemServerProcess來承擔自己的職責。

SystemService

現在SS走到了RuntimeInit中。代碼在RuntimeInit.java中,如下所示:

SystemService
SystemService

上面有兩個關鍵點:

1. zygoteInitNative分析:

它是一個native函數,實作在AndroidRuntime.cpp中

SystemService

由于SS是從zygote fork出來的,是以它也擁有zygote程序中定義的這個gCurRuntime,也就是AppRuntime對象。那麼,它的onZygoteInit會幹些什麼呢?

代碼如下:

SystemService

SS調用zygoteInitNative後,将與Binder通信系統建立聯系,這樣SS就能夠使用Binder了。(Binder第6章介紹)

2. invokeStaticMain分析,第二個關鍵點

SystemService
SystemService

這裡invokeStaticMain抛出了一個異常,它是在ZygoteInit的main函數中被截獲:

SystemService

抛出這個異常最後會導緻com.android.server.SystemServer類的main函數被調用。為什麼不直接調用,而是采用抛異常的方法?

SystemService

SystemServer的真面目:

ZygoteInit分裂産生SS,其實就是為了調用com.android.server.SysteServer的main函數。下面看看這個真實的main函數:

SystemService

其中main函數将加載libandroid_server.so庫

init1分析

init1是native函數,在com_android_server_SystemServer.cpp中實作:

SystemService

system_init的實作在system_init.cpp中,它的代碼如下所示:

SystemService
SystemService

init1函數建立了一些系統服務,然後把調用線程加入到了Binder通信中。不過其間還通過JNI調用了com.android.server.SystemServer類的init2函數。

SystemService

啟動了一個ServerThread線程,直接看它的run函數。

SystemService
SystemService

init2就是單獨建立一個線程,用以啟動系統的各項服務。Java世界的核心Server都在這裡啟動,是以它非常重要

SystemServer的總結:

SystemService

繼續閱讀