Android系統剖析 和 Android系統的運行機制: 啓動流程與層間交互,2015-02-28
Android運行機制(看圖說話)
1. 啓動流程
所有從init開始…
與大多數的基於Linux系統在啓動階段類似,bootLoader加載Linux內核,然後開始init進程。
init啓動Linux守護進程,包括:
USB守護進程(usbd)來管理USB連接
Android調試橋守護進程(adbd)來管理ADB連接
調試器守護進程(debuggerd)來管理調試進程請求(dump memory等等)
射頻接口層守護進程(rild)來管理與射頻的通信
Init進程啓動zygote進程:
一個新生的進程初始化一個Dalvik VM實例
加載類,並監聽socket端口用於請求創建VMs實例
Forks請求創建VM實例用於管理進程
寫時複製(Copy-on-write)來最大化重用和最小化覆蓋
init進程啓動runtime進程:
初始化Service Manager——上下文管理器用於binder來處理service註冊和查詢
註冊Service Manager作爲缺省的上下文管理用於Binder
Runtime進程發送請求給Zygote來啓動System Service
接着Zygote進程fork一個新的VM實例用於System Service進程,然後啓動該service。
System Service啓動本地系統服務器,包括:
Surface Flinger
Audio Flinger
本地system servers註冊Service Manager作爲IPC service目標:
System Service啓動Android管理服務(framework層各種service和manager):
Android管理服務註冊到Service Manager中:
到此,整個Android系統的啓動後:
System Server加載完所有的services後, 系統準備 過程如下…
zygote生產出home的dalvik vm:
底層出現libc:
zygote逐個生產出dalvik vm:
2. 層間交互(Layer Interaction)
主要有如下三種類型的交互:
App -> Runtime Service -> lib
App -> Runtime Service -> Native Service -> lib
App -> Runtime Service -> Native Daemon -> lib
Android Runtime Services:
舉例:Location Manager
Android Native Services:
舉例:MediaPlayer
增加ALSA?
丟棄了kernel driver?
Daemon Connection:
native service 被替換爲 daemon, binder IPC 被替換爲sockets方式,如下:
舉例:RILD
Telephony Manager
(完)