歡迎你們前往騰訊雲+社區,獲取更多騰訊海量技術實踐乾貨哦~linux
本文由 goo發表於 雲+社區專欄相信咱們對Android系統都不陌生,而Android系統博大精深,被各類各樣的智能設備承載的同時,咱們會否好奇過,如此複雜的Android到底是怎麼運做起來的呢?借本文給你們分享,筆者對Android 系統啓動流程的總體理解~android
hi, I'm Androidgit
下面是Android啓動的核心步驟流程圖,看文字的時候,記得回來對照圖來理解喔,但願閱讀全文後,回觀流程圖,會有恍然大悟的感受,那麼文章的目的就達到啦~小程序
總體流程緩存
系統從 ROM 中開始啓動,加載引導程序到 RAM ,而後執行。網絡
引導程序是 Android 操做系統開始運行前的一個小程序,所以它須要針對特定主板與芯片,並非 Android 操做系統的一部分。引導程序是 OEM 廠商或運行商進行加鎖、限制的地方。app
Android引導程序能夠在bootablebootloaderlegacyusbloader找到,傳統的加載器包含的兩個文件:機器學習
Android 內核啓動方式相似桌面 linux,主要步驟:socket
1. 設置緩存函數
2. 被保護存儲器
3. 計劃列表
4. 加載驅動
當內核完成系統設置,接下來即將啓動系統的第一個進程 -- init 進程
做爲 Android 系統的第一個進程,其PID爲0,經過解析 init.rc 腳本來構建出系統初始運行形態,這一階段中,「Android」 logo 會顯示出來
(系統中,大多數系統服務程序都是在該腳本中描述並被相繼啓動的)
init.rc 由4種類型聲明組成:Actions、Commands、Services、Options
科普:Daemons - 守護進程
init進程經過解析 init.rc 來陸續啓動其餘關鍵的系統服務進程,其中最重要的是 ServiceManager、Zygote 和 SystemServer 三者,下面咱們逐一解析:
概述:ServiceManager 是 Binder 機制中的支撐者,負責某 Binder 服務註冊信息到底層 Binder 驅動分配的值解析。
ServiceManager 由 init 進程解析 rc 腳本時啓動,屬於 core 類,其餘同類進程包括:uenetd、console、adbd等。根據 core 組的特性,這些進程會同時啓動或中止。另外,ServiceManager 配置含有 critical 屬性,這意味着它是系統關鍵進程(若是進程不幸在4分鐘內異常退出超過4次,設備將重啓並進入還原模式)。當 ServiceManager 每次重啓時,其餘關鍵進程:zygote、media、surfaceflinger 等也會被 restart。
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 流程總結
(
摘自:Gityuan -- Android 系統啓動-Zygote 篇
)
ZygoteInit 結束後,開機Logo就出來了。
(注意:這裏並不包括開機動畫,而是開機前 「Android」 Logo 出現的那個畫面,開機動畫出現以前還須要進行各類加載,開機動畫是在「Android」 Logo 出現以後才播放的)
SystemServer 是 Android 進入 Launcher 前的最後準備,它提供了衆多的由「Java」語言編寫的系統服務。
若是 init.rc 中爲 zygote 指定啓動參數 --start-system-server,那麼 ZygotyeInit 就會調用 startSystemServer 來進入 SystemServer。
上面對 Android 系統啓動作了一個簡述,意在給你們展示一個總體流程,其中每一個環節涉及的知識點只是淺淺掠過,筆者也尚在學習與探索中,但願在後續再做詳細分析。
相關閱讀
【每日課程推薦】機器學習實戰!快速入門在線廣告業務及CTR相應知識
此文已由做者受權騰訊雲+社區發佈,更多原文請點擊
搜索關注公衆號「雲加社區」,第一時間獲取技術乾貨,關注後回覆1024 送你一份技術課程大禮包!
海量技術實踐經驗,盡在雲加社區!