前言java
針對系統啓動流程的專題研究也進行了差很少一週了,雖然進度緩慢,但也算是有一些閱讀源碼的心得,以及對源碼的一點理解markdown
因爲系統啓動流程涉及的源碼相對較多,因此決定分幾篇文章來寫,本篇主要是對啓動流程進行一個簡單的概述,以及談一下我我的的讀源碼的方法架構
福利活動app
由Android研習社
和機械工業出版社
聯合發起的贈書活動正在進行中,歡迎你們點擊連接參與函數
正文post
這裏說的啓動流程是指Android系統的啓動流程動畫
讓咱們來回想一下,咱們是如何「啓動」一個全新未開封的Android手機的:spa
是否是感受步驟仍是挺多的?其實我們主要作的仍是隻負責按電源鍵就OK了,我們要分析的,就是從1-5
這幾步,系統都作了哪些事情,我簡單畫了個圖(ps:這也叫圖?): code
刷過機的朋友大概都知道,Android能夠經過某個組合按鍵進入BootLoader頁面,這個也就是上圖中的最底層,在Android系統,甚至於它的內核還未加載時的一個引導程序,主要負責對kenel進行解壓和初始化的工做orm
kernel中的idle進程是0號進程,由內核中啓動,並始終執行在內核態,由內核態的idle進程開啓咱們常提的1號進程,init(對應源碼,system/core/init/init.cpp
)
這個進程也是鄧老師的書中所提到的,「天字號」進程,可是通過咱們上面的分析,其實它並非開天闢地的始祖
init.cpp
中作的事情其實不僅是開啓init
進程,這個後面分析具體源碼時再作詳細介紹
init進程負責的事情主要是對init.rc
這個系統啓動腳本文件進行解析(loadBootScripts()
),通過對ro.zygote
對應的具體的架構的腳本文件進行解析,進行到第四步
zygote進程的入口我找了很久,其實zygote.rc中的腳本已經說的很清楚了
由此咱們找到對應的源碼位置在framework/base/cmds/app_process/app_main
app_process
中把
app_main
運行的進程設置
process_name
爲zygote,這也就是咱們在執行
ps
指令時看到的
zygote
進程了,此時zygote還處於
native
層,經過jni調用
zygoteInit.java
中的
main
函數,正式進入
Java
世界,zygoteInit中又開啓了
SystemServer
,進入第四步
這部分源碼還沒閱讀到,這裏只是先簡單提一下...
Launcher已是咱們具體的App應用了,這個是由zygote進程fork出來的進程
到此,通過這麼多步驟,系統終於啓動起來,而且能夠跟用戶交互了
正所謂,授人以魚,不如受人以漁,因此我仍是簡單提一下,我是如何去閱讀源碼的
這個問題我跟朋友探討過,也跟前輩請教過,目前我是採用這樣的方式
好比針對系統啓動流程的相關源碼,若是我對這一塊徹底陌生,沒有任何概念,那我須要先去閱讀相關的書籍,好比鄧老師的《深刻理解Android》
,或者去找一些相關文章,先對這一塊有一個大概的概念,具體涉及到了哪些類,涉及了哪些流程
而後再針對這些具體類,或者流程,提出本身的疑問,或者說,本身給本身去提一些問題,而後帶着這些具體的問題,再去深刻源碼研究
還有最最重要的是,要明確讀源碼的目的和相關問題,不要陷入細節中不能自拔,好比我其實花了好久想搞懂kernel
中的idle
進程是如何啓動system
中的init
進程的,可是這個問題其實沒有那麼重要,
下一篇文章將詳細介紹init啓動流程的相關源碼,抓大放小,與君共勉
以爲不錯?不妨點個贊,而後關注下?