當咱們按下電源鍵,Android 究竟作了些什麼?

歡迎你們前往騰訊雲+社區,獲取更多騰訊海量技術實踐乾貨哦~linux

本文由 goo發表於 雲+社區專欄

相信咱們對Android系統都不陌生,而Android系統博大精深,被各類各樣的智能設備承載的同時,咱們會否好奇過,如此複雜的Android到底是怎麼運做起來的呢?借本文給你們分享,筆者對Android 系統啓動流程的總體理解~android

imghi, I'm Androidgit

如今,按下電源鍵

下面是Android啓動的核心步驟流程圖,看文字的時候,記得回來對照圖來理解喔,但願閱讀全文後,回觀流程圖,會有恍然大悟的感受,那麼文章的目的就達到啦~小程序

img總體流程緩存

1、啓動電源及系統啓動

系統從 ROM 中開始啓動,加載引導程序到 RAM ,而後執行。網絡

2、引導程序

引導程序是 Android 操做系統開始運行前的一個小程序,所以它須要針對特定主板與芯片,並非 Android 操做系統的一部分。引導程序是 OEM 廠商或運行商進行加鎖、限制的地方。app

1 兩個階段

  1. 檢測外部 RAM 以及爲第二階段加載程序
  2. 設置網絡、內存等,搭建內核運行環境(爲了達到特殊目的時,引導程序能夠根據配置參數或者輸入數據來設置內核)

2 引導程序的加載器

Android引導程序能夠在bootablebootloaderlegacyusbloader找到,傳統的加載器包含的兩個文件:機器學習

  1. init.s 初始化堆棧,清零BSS段,會調用 main.c 中的 _main()函數 (bss segment:一般是指用來存放程序中未初始化的全局變量的一塊內存區域;BSS - Block Started by Symbol。BSS段屬於靜態內存分配)
  2. main.c 初始化硬件,建立 linux 標籤

3、內核啓動

Android 內核啓動方式相似桌面 linux,主要步驟:socket

1. 設置緩存函數

2. 被保護存儲器

3. 計劃列表

4. 加載驅動

當內核完成系統設置,接下來即將啓動系統的第一個進程 -- init 進程

4、init 進程

做爲 Android 系統的第一個進程,其PID爲0,經過解析 init.rc 腳本來構建出系統初始運行形態,這一階段中,「Android」 logo 會顯示出來

(系統中,大多數系統服務程序都是在該腳本中描述並被相繼啓動的)

init.rc 由4種類型聲明組成:Actions、Commands、Services、Options

  • Actions:響應某事件的過程。當「trigger」所描述的觸發事件產生時,則依次執行各類「command」 源碼角度:系統會對 init.rc 中各「trigger」進行匹配,當發現符合條件的 Action,就將它加入「命令執行隊列」尾部(除非 Action 已存在隊列中),而後系統再對這些命令按順序進行。on <trigger> ##觸發條件 <command1> ##執行命令 <command2> ##可執行多個命令 ...
  • Commands:命令將在所屬事件發生時被一個個執行
  • Services:可執行程序,它們在特定選項的約束下會被 init 程序運行或者重啓(Service 能夠在配置中指定是否須要退出重啓,那麼,當 Service 出現異常 crash 時,可有機會復原)service <name><pathname> [<argument>]* <option> <option>
  • Options:對 service 的約束選項

五和6、 ServiceManager、Zygote、SystemServer

科普:Daemons - 守護進程

init進程經過解析 init.rc 來陸續啓動其餘關鍵的系統服務進程,其中最重要的是 ServiceManager、Zygote 和 SystemServer 三者,下面咱們逐一解析:

1 ServiceManager -- Binder 機制支撐者

概述:ServiceManager 是 Binder 機制中的支撐者,負責某 Binder 服務註冊信息到底層 Binder 驅動分配的值解析。

ServiceManager 由 init 進程解析 rc 腳本時啓動,屬於 core 類,其餘同類進程包括:uenetd、console、adbd等。根據 core 組的特性,這些進程會同時啓動或中止。另外,ServiceManager 配置含有 critical 屬性,這意味着它是系統關鍵進程(若是進程不幸在4分鐘內異常退出超過4次,設備將重啓並進入還原模式)。當 ServiceManager 每次重啓時,其餘關鍵進程:zygote、media、surfaceflinger 等也會被 restart。

2. Zygote -- 「孕育」新線程與進程

Android 中大多數應用進程與系統進程都是經過 Zygote 來生成的。Zygote 一樣由 init 解析 rc 腳本時啓動,屬於 main 類,同屬 main 類的系統進程有:netd、debuggerd、rild等。Zygote並非處於獨立的程序中的,它所在程序名爲「app_process」,觀察 app_process 主函數實現知道,若是 init.rc 中指定了 --zygote選項,app_process 接下來將啓動「ZygoteInit」,並傳入「start-system-server」,這樣,ZygoteInit 就會運行在虛擬機上(Dalvik VM)上了。

  • ZygoteInit 函數有兩項重要工做
  • 預裝載各類系統類
  • 搭建 SystemServer 環境,並啓動 SystemServer(大部分的 Android 系統服務都在其中,由 Java 編寫)
  • ZygoteInit 流程總結

    摘自:Gityuan -- Android 系統啓動-Zygote 篇

    1. 解析init.zygote.rc中的參數,建立AppRuntime並調用AppRuntime.start()方法;
    2. 調用AndroidRuntime的startVM()方法建立虛擬機,再調用startReg()註冊JNI函數;
    3. 經過JNI方式調用ZygoteInit.main(),第一次進入Java世界;
    4. registerZygoteSocket()創建socket通道,zygote做爲通訊的服務端,用於響應客戶端請求;
    5. preload()預加載通用類、drawable和color資源、openGL以及共享庫以及WebView,用於提升ap啓動效率;
    6. zygote完畢大部分工做,接下來再經過startSystemServer(),fork得力幫手system_server進程,也是上層framework的運行載體。
    7. zygote功成身退,調用runSelectLoop(),隨時待命,當接收到請求建立新進程請求時當即喚醒並執行相應工做。

ZygoteInit 結束後,開機Logo就出來了。

(注意:這裏並不包括開機動畫,而是開機前 「Android」 Logo 出現的那個畫面,開機動畫出現以前還須要進行各類加載,開機動畫是在「Android」 Logo 出現以後才播放的)

3. SystemServer -- 大部分 Android 系統服務所在地

SystemServer 是 Android 進入 Launcher 前的最後準備,它提供了衆多的由「Java」語言編寫的系統服務

若是 init.rc 中爲 zygote 指定啓動參數 --start-system-server,那麼 ZygotyeInit 就會調用 startSystemServer 來進入 SystemServer。

  • startSystemServer函數解析:
  • 首先 ZygoteInit 經過 Zygote.forkSystemServer 來生成一個新的線程(fork),用於承載各類系統服務。(源碼角度:Zygote 內部由 Native 函數 Dalvik_dalvik_system_Zygote_forkSystemServer 來進一步實現,最終調用底層接口的 fork 接口來實際產生進程)
  • 根據fork特性,子進程與父進程將得到相同的代碼環境pid爲0爲子進程,不然爲父進程;若是是前者,則進一步調用 handleSystemServerProcess(parseArgs) 函數來完成最核心的工做 -- 「啓動各系統服務」(源碼角度:handleSystemServerProcess 方法將 startSystemServer 中的 parsedArgs.remainingArgs 參數傳給 RuntimeInit.zygoteInit,後者又調用 nativeZygoteInit 函數
  • nativeZygoteInit 調用後,接着,三個重要的 static 函數就要被執行了:init1 - 完成本地Service(SurfaceFlinger、AudioFlinger等)啓動,完成後調用 init2init2 - 新建一個新的帶 Looper 的線程 ServerThread來啓動 Java層各 Service

後語

上面對 Android 系統啓動作了一個簡述,意在給你們展示一個總體流程,其中每一個環節涉及的知識點只是淺淺掠過,筆者也尚在學習與探索中,但願在後續再做詳細分析。

資源推薦

相關閱讀
【每日課程推薦】機器學習實戰!快速入門在線廣告業務及CTR相應知識

此文已由做者受權騰訊雲+社區發佈,更多原文請點擊

搜索關注公衆號「雲加社區」,第一時間獲取技術乾貨,關注後回覆1024 送你一份技術課程大禮包!

海量技術實踐經驗,盡在雲加社區

相關文章
相關標籤/搜索