Android系統啓動
其實Android系統的啓動最主要的內容無非是init、Zygote、SystemServer這三個進程的啓動,他們一起構成的鐵三角是Android系統的基礎。
啓動大綱
啓動電源以及引導程序加載
引導程序BootLoader啓動
Linux內核啓動
init進程啓動
Zygote進程啓動
SystemServer進程啓動
Launcher啓動
啓動流程圖
啓動詳解
init進程啓動的準備工作
init進程是在Linux內核加載完成後啓動的,因此要想啓動init進程,必須先加載Linux內核,而Linux則是由引導程序BootLoader拉起來的。
當電源被按下後,引導芯片代碼(ROM)執行,並將引導程序BootLoader加載到RAM中執行。
BootLoader運行,它的作用就是把系統OS拉起來並運行。
Linux內核被拉起運行後,會設置緩存、被保護存儲器、計劃列表、加載驅動等,最後會在系統文件中尋找init.rc文件,啓動init進程。
init進程啓動
init進程主要用於初始化和啓動屬性服務,並啓動Zygote進程。init進程的源碼在system/core/init/init.cpp`下。
創建和掛載啓動所需要的文件目錄(tmpfs、devpts、proc、sysfs和selinuxfs),他們都是系統運行時目錄。
初始化並啓動屬性服務(類似window裏面的註冊表)。
解析init.rc配置文件。
啓動Zygote進程。
Zygote進程啓動
在Android系統中,DVM和ART、應用程序進程以及運行系統的關鍵服務SystemServer進程都是由Zygote進程來創建的,我們也可以將其稱爲孵化器。它通過fork的形式來創建應用程序進程和SystemServer進程。
init進程調用app_main創建了AndroidRuntime,通過調用它的start方法來啓動Zygote。
在AndroidRuntime中創建了Java虛擬機,併爲其註冊了JNI方法
通過JNI反射調用ZygoteInit進入Zygote的Java框架層,最終啓動了Zygote進程。
ZygoteInit的main方法
這裏需要注意的是,之前的所以初始化操作都是在Native層進行的,直到我們通過JNI調用ZygoteInit的main方法後,我們才進入了Java框架層。
創建了一個Server端的socket(主要用於跨進程通信)。
預加載類和資源。
啓動SystemServer進程。
等待AMS(ActivityManagerService)請求創建新的應用程序進程。
SystemServer進程啓動
SystemServer進程主要用於創建和啓動系統服務,包括我們常用的AMS、WMS和PMS等。
啓動Binder線程池,用於與其他進程進行通信。
創建SystemServiceManager,其用於對系統的服務進行創建、啓動和生命週期的管理。
啓動各種系統服務(引導服務、核心服務和其他服務等)
Launcher啓動
Launcher通俗地說就是Android系統的桌面,是系統的門戶,用於啓動應用程序,其本質就是一個Activity,類名爲"com.android.launcher3.Launcher",點擊查看Launcher的AndroidManifest.xml。
SystemServer調用AMS的
systemReady
方法準備啓動LauncherAMS中又會調用ActivityStackSupervisor和ActivityStack進行一系列的準備工作,最終又調用了AMS的
startHomeActivityLocked
方法,使用ActivityStarter的startHomeActivityLocked
啓動Launcher。
啓動架構示意圖
我們都知道Android系統架構是Linux Kernel、Android Runtime、Liberaries、Application Framework和Application這五個部分組成的,如下圖所示:
那麼Android系統在啓動過程中,都經歷了哪些架構組成部分呢?以下給出簡要的示意圖:
掃碼關注
本文分享自微信公衆號 - 我的Android開源之旅(openandroidxx)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。