1. 程式人生 > >當我們按下電源鍵,Android 究竟做了些什麼?

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

歡迎大家前往騰訊雲+社群,獲取更多騰訊海量技術實踐乾貨哦~

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

相信我們對Android系統都不陌生,而Android系統博大精深,被各種各樣的智慧裝置承載的同時,我們會否好奇過,如此複雜的Android究竟是怎麼運作起來的呢?借本文給大家分享,筆者對Android 系統啟動流程的整體理解~

imghi, I’m Android

現在,按下電源鍵

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

img整體流程

一、啟動電源及系統啟動

系統從 ROM 中開始啟動,載入載入程式到 RAM ,然後執行。

二、載入程式

載入程式是 Android 作業系統開始執行前的一個小程式,因此它需要針對特定主機板與晶片,並不是 Android 作業系統的一部分。載入程式是 OEM 廠商或執行商進行加鎖、限制的地方。

1 兩個階段

  1. 檢測外部 RAM 以及為第二階段載入程式
  2. 設定網路、記憶體等,搭建核心執行環境(為了達到特殊目的時,載入程式可以根據配置引數或者輸入資料來設定核心)

2 載入程式的載入器

Android載入程式可以在\bootable\bootloader\legacy\usbloader找到,傳統的載入器包含的兩個檔案:

  1. init.s 初始化堆疊,清零BSS段,會呼叫 main.c 中的 _main()函式 (bss segment:通常是指用來存放程式中
    未初始化的全域性變數
    的一塊記憶體區域;BSS - Block Started by Symbol。BSS段屬於靜態記憶體分配)
  2. main.c 初始化硬體,建立 linux 標籤

三、核心啟動

Android 核心啟動方式類似桌面 linux,主要步驟:

1. 設定快取

2. 被保護儲存器

3. 計劃列表

4. 載入驅動

當核心完成系統設定,接下來即將啟動系統的第一個程序 – init 程序

四、init 程序

作為 Android 系統的第一個程序,其PID為0,通過解析 init.rc 指令碼來構建出系統初始執行形態,這一階段中,“Android” logo 會顯示出來

(系統中,大多數系統服務程式

都是在該指令碼中描述並被相繼啟動的)

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

  • **Actions:**響應某事件的過程。當“trigger”所描述的觸發事件產生時,則依次執行各種“command” **原始碼角度:系統會對 init.rc 中各“trigger”進行匹配,當發現符合條件的 Action,就將它加入“命令執行佇列”**尾部(除非 Action 已存在佇列中),然後系統再對這些命令按順序進行。on ##觸發條件 ##執行命令 ##可執行多個命令 …
  • **Commands:**命令將在所屬事件發生時被一個個執行
  • Services:可執行程式,它們在特定選項的約束下會被 init 程式執行或者重啟(Service 可以在配置中指定是否需要退出重啟,那麼,當 Service 出現異常 crash 時,可有機會復原)service []*
  • **Options:**對 service 的約束選項

五和六、 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 系統啟動做了一個簡述,意在給大家展現一個整體流程,其中每個環節涉及的知識點只是淺淺掠過,筆者也尚在學習與探索中,希望在後續再作詳細分析。

資源推薦

此文已由作者授權騰訊雲+社群釋出,更多原文請點選

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

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