深刻研究源碼:Android10.0系統啓動流程(一)

前言java

針對系統啓動流程的專題研究也進行了差很少一週了,雖然進度緩慢,但也算是有一些閱讀源碼的心得,以及對源碼的一點理解markdown

因爲系統啓動流程涉及的源碼相對較多,因此決定分幾篇文章來寫,本篇主要是對啓動流程進行一個簡單的概述,以及談一下我我的的讀源碼的方法架構

福利活動app

Android研習社機械工業出版社聯合發起的贈書活動正在進行中,歡迎你們點擊連接參與函數

正文post

啓動流程概述

這裏說的啓動流程是指Android系統的啓動流程動畫

讓咱們來回想一下,咱們是如何「啓動」一個全新未開封的Android手機的:spa

  1. 按電源鍵
  2. 進入開機動畫
  3. 通過漫長的等待(大概幾分鐘?哈哈)
  4. 開機動畫結束
  5. 正式開機,進入設置畫面
  6. 進入系統桌面(Launcher)

是否是感受步驟仍是挺多的?其實我們主要作的仍是隻負責按電源鍵就OK了,我們要分析的,就是從1-5這幾步,系統都作了哪些事情,我簡單畫了個圖(ps:這也叫圖?): code

  1. loader

刷過機的朋友大概都知道,Android能夠經過某個組合按鍵進入BootLoader頁面,這個也就是上圖中的最底層,在Android系統,甚至於它的內核還未加載時的一個引導程序,主要負責對kenel進行解壓和初始化的工做orm

  1. idle進程

kernel中的idle進程是0號進程,由內核中啓動,並始終執行在內核態,由內核態的idle進程開啓咱們常提的1號進程,init(對應源碼,system/core/init/init.cpp

  1. init進程

這個進程也是鄧老師的書中所提到的,「天字號」進程,可是通過咱們上面的分析,其實它並非開天闢地的始祖

init.cpp中作的事情其實不僅是開啓init進程,這個後面分析具體源碼時再作詳細介紹

init進程負責的事情主要是對init.rc這個系統啓動腳本文件進行解析(loadBootScripts()),通過對ro.zygote對應的具體的架構的腳本文件進行解析,進行到第四步

  1. 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,進入第四步

  1. SystemServer

這部分源碼還沒閱讀到,這裏只是先簡單提一下...

  1. Launcher

Launcher已是咱們具體的App應用了,這個是由zygote進程fork出來的進程

到此,通過這麼多步驟,系統終於啓動起來,而且能夠跟用戶交互了

如何閱讀源碼

正所謂,授人以魚,不如受人以漁,因此我仍是簡單提一下,我是如何去閱讀源碼的

這個問題我跟朋友探討過,也跟前輩請教過,目前我是採用這樣的方式

好比針對系統啓動流程的相關源碼,若是我對這一塊徹底陌生,沒有任何概念,那我須要先去閱讀相關的書籍,好比鄧老師的《深刻理解Android》,或者去找一些相關文章,先對這一塊有一個大概的概念,具體涉及到了哪些類,涉及了哪些流程

而後再針對這些具體類,或者流程,提出本身的疑問,或者說,本身給本身去提一些問題,而後帶着這些具體的問題,再去深刻源碼研究

還有最最重要的是,要明確讀源碼的目的和相關問題,不要陷入細節中不能自拔,好比我其實花了好久想搞懂kernel中的idle進程是如何啓動system中的init進程的,可是這個問題其實沒有那麼重要,

下一篇文章將詳細介紹init啓動流程的相關源碼,抓大放小,與君共勉

寫在最後

以爲不錯?不妨點個贊,而後關注下?

相關文章
相關標籤/搜索