Android中SystemServer,Zygote,ServiceManager三者之間的關係

看到android設備的進程列表,發現了好多個進程。但是回憶最近的android app開發,發現所有的相關處理和麪試都是集中在systemServer中的,而關於zytote和ServiceManager的東西實際考察和使用較少。

突然想問自己,三者在android中的關係是怎樣的。就這個問題,寫個比較總結下。

1. 啓動順序關係
ServiceManager最先啓動,Zygote再啓動,最後啓動systemServer。啓動順序決定了進程的依賴性。

1. 啓動Zygote目的,就是爲了啓動systemServer進程。所有的java進程啓動都由Zygote完成,systemServer是一個java進程。那麼Zygote必然需要在systemServer之前啓動。
2. ServiceManager最先啓動的理由:systemServer的啓動中有很多service啓動,而這些service啓動後,需要使用binder和實際的服務通訊。給ServiceManager中的service提供服務的主體服務服務器由init進程啓動,service和主體服務之間的通訊依賴於binder,ServiceManager就是給service和主體服務之間實現通訊的工具。 因此service和主體服務都依賴於ServiceManager,那麼ServiceManager 必然是最先啓動。

2. 功能邏輯關係
serviceManager只有一個功能就是提供binder通訊服務。Zygote也是一個功能創建java進程。SystemServer是一個功能集合,提供serviceManager的binder通訊功能給開發者,同時通過binder功能和實際的主體服務通訊完成功能;整體來說SystemServer就是一個代理者,可以調用系統各個模塊的功能,同時使得系統各個模塊的功能可以有條不紊的運行。SystemServer在啓動過程中使用SystemSerivceManager啓動了很多systemService,並且將這些systemService添加到了serviceManager中。

app的啓動,app通過binder告訴SystemServer,然後SystemServer告訴Zygote,最後Zygote啓動app。

app調用service總的來說就是通過serviceManager找到對應服務的binder proxy。那麼最後就通過proxy調用到哪一個進程由service所在的進程決定;通過SystemSerivceManager添加到serviceManager中到服務,最終會調用到SystemServer進程,然後處理;還有一些由進程啓動後主動添加到serviceManager到服務,本身存在於一個單獨到進程中到,例如mediaserver,是由app進程獲取到binder proxy後,直接調用到mediaserver進程,但是在app進程中關於mediaServer的proxy代理,在系統層面封裝了接口,並沒有直接提供proxy對象。

因此

serviceManager中註冊了很多service,每一個service對應一個binder代理,但是注意並不是每一個binder代理都可以對應一個唯一的進程,每一個binder 代理都可以對應一個進程中都一個binder服務。

zygote專門用來啓動java進程的進程。包含systemServer都是一個java進程。

systemServer整合系統各類服務; app可以通過binder調用到systemServer,而systemServer需要調用實際功能時,可以通過socket和zygote通訊,完成app進程創建;可以通過binder和mediaServer通訊,完成媒體播放。簡單來說,就是通過各類進程通訊,調用系統提供都服務完成功能。
由於這裏的整合,app開發者只需要使用android的API調用就可以完成絕大多數進程通訊,實現功能。避免app開發者實現各類複雜進程通訊。

那麼關於android的serviceManager是如何管理binder的呢?讓各個模塊和進程都可以保存信息到這裏來,未完成的任務,待續。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章