Android基礎之Android系統啓動

Android系統的啓動操做流程由Linux系統啓動Android應用系統啓動兩個階段組成。android

Linux系統啓動shell

Android操做系統啓動次序分別爲系統上電,Bootloader引導,Linux內核啓動,init初始化系統服務等。安全

1. 系統上電與啓動ROMapp

如同傳統的PC設備,Android系統的CPU上電覆位後,將程序指針指向復位時的零地址(啓動地址),從該地址讀取啓動程序的可執行代碼直接運行,或者將可執行代碼與數據載入CPU內置的RAM中再運行。所謂的啓動ROM內固化有啓動代碼,其起始地址就設在CPU復位後的啓動地址(零地址)處,CPU復位後指針指向該處,開始執行代碼。框架

2. Bootloader引導程序socket

Bootloader被燒錄進入android系統後,系統上電覆位,Bootloader被載入,在操做系統內核運行以前獲得執行。經過這段小啓動程序,咱們能夠初始化硬件設備,創建內存空間映射圖,從而將系統的軟,硬件環境帶到一個合適的狀態,以便爲最終調用操做系統內核準備好環境,完成整個系統的加載啓動任務。好比在一個基於ARM7TDMI core的嵌入式系統中,系統在上電或復位時一般都從地址0x00000000處開始執行,而在這個地址處安排的一般就是系統的Bootloader引導程序。Bootloader本質做用至關於電腦的BIOS,在手機進入操做系統以前初始化軟硬件環境,最終讓手機成功啓動。性能

Android是一個開源系統,如不加修改,必將形成同質化,這是OEM/ODM廠商們必須考慮的問題。目前,各大廠商爲了得到獨有的系統價值,系統的穩定運行,用戶信息安全等,最經常使用的方式是對Bootloader加密(加鎖)。加密的Bootloader僅能引導原廠提供的固件(操做系統內核與主要應用軟件),對任何第三方固件都不予識別。以前,除了發燒友,人們通常不會更多關注Bootloader的加鎖問題。但隨着Android的普及與人們對個性化的極致追求,愈來愈多的用戶開始關注是否可以解鎖Bootloader,進而加載其餘固件。加密

可是,當每一臺Android手機都能隨意刷寫固件時,不但存在潛在的系統穩定性與系統安全問題,並且對於廠商而言,更加擔憂其生產的手機在某種程度上淪爲一種硬件平臺,自身蘊含於軟件中的所謂「靈魂」將不復存在。此外,OEM廠商在新機型上新添加了不少功能,因爲Bootloader的解鎖,用戶能夠經過更換固件,將新固件直接用於老型號機器,使廠商蒙受損失,所以,OEM廠商一般對Bootloader進行加密或加鎖處理,限制用戶自行更改spa

然而,Android的開源本質體現的是一種共享與尊重。「Bootloader」的鎖與不鎖在技術上並非難題,在確保安全的前提下,更應首先考慮用戶的選擇:給須要的用戶解鎖,爲不須要的用戶保留!操作系統

3. Linux內核啓動

Linux內核有兩種映像:一種是非壓縮內核,稱爲Image,另外一種是壓縮內核,稱爲zImage。根據內核映像的不一樣,Linux內核的啓動在開始階段也有所不一樣。zImage是Image通過壓縮造成的,因此它的大小比Image小。可是在使用zImage以前,必須在它的開頭加上解壓縮的代碼,zImage解壓縮以後才能執行,所以它的執行速度比Image要慢。考慮到嵌入式系統的存儲空間通常比較小,採用zImage能夠佔用較少的存儲空間,所以犧牲一點性能上的代價也是值得的。因此通常的嵌入式系統均採用壓縮內核的方式

Bootloader啓動後,系統啓動的控制權移交給Kernel。Kernel啓動主要包括:初始化內核,初始化設備驅動,啓動內核,掛載文件系統和啓動用戶空間進程。

4. Init初始化系統服務

init是全部Linux系統進程的父進程,其進程ID爲1,它負責系統的初始化和啓動,建立並運行系統中的關鍵進程,好比shell,lgoin等。init也理所固然地成爲Android系統中的第一個進程,被賦予更多重要的工做職責,好比建立zygote進程,提供一個屬性服務(property service)來管理系統屬性。

Android應用系統啓動

Linux內核啓動完畢以後,init進程將開始啓動Android應用系統。init進程建立Android系統中的關鍵進程,如Android系統本地服務(Native Service)Zygote進程,其中Zygote進程和其子進程Android系統服務(System Server)是Andorid系統的基礎。在相繼啓動Zygote進程和System Server進程成功後,系統將啓動主頁面(home),在主頁面啓動成功以後,Android應用系統啓動才正式完成。Android系統應用程序啓動的總體流程以下圖:

下面詳細說明每一步啓動流程:

1. 啓動Android系統本地服務

Android系統本地服務(Native Service)由init啓動的,屬於核心服務,採用C++語言編寫,在運行時庫層上實現Native Service是Android系統內核層與Android應用層通訊的重要管道,經過socket嚮應用層提供特定的服務

Native Service啓動項定義在 init.rc 中,提供的本地服務主要有:

  • Console,shell console服務

  • Servicemanager,Binder服務管理器,管理全部Android系統服務。

  • Vold(Volume Daemon),支持存儲外設的熱插拔。

  • Mountd(設備安裝Daemon),負責設備安裝及狀態通知。

  • Debuggerd(Debug Daemon),處理調試進程的請求。

  • Rild(radio interface layer),無線接口層。

  • Zygote,啓動Dalvik並負責進程孵化服務。

  • Mediaserver,負責多媒體播放相關的功能,包括音視頻解碼,顯示輸出等。

2. 啓動Zygote

Zygote由init進程根據 init.rc 文件中的配置項建立。Zygote最初的名字叫「app_process」,但在運行過程當中app_process經過Linux下的pctrl系統調用將本身的名字變成了Zygote。

Zygote是一個虛擬機進程,同時也是一個虛擬機實例的孵化器。Zygote負責虛擬機的初始化,預置類庫的加載和初始化等操做。每當系統要求執行一個Android應用程序時,Zygote就會建立一個子進程來執行該應用程序。其優勢在於,當系統須要一個新的虛擬機實例時,Zygote經過自身複製的方式,能夠快速地爲系統提供虛擬機實例。另外,對於一些只讀的系統庫,全部虛擬機實例都和Zygote共享同一塊內存區域,有助於節省內存開銷。Zygote進程是整個Android的孵化器進程,全部的Activity進程均是經過它來生成的

3. 啓動Android系統服務

Android系統服務(System Server)做爲Zygote的第一個子進程,也是由Zygote進程孵化出來的。它是Android框架層的核心,主要負責Android系統初始化並啓動其餘服務。Android的其餘服務都由Systemserver啓動並運行在該進程空間。在Zygote進程啓動過程當中經過指定參數「--start-system-server」來實現SystemServer的啓動。

4. 啓動Android系統主界面

在完成Android系統應用程序啓動後,還須要有一個主頁面(Home)應用程序來負責把它們在桌面上展現出來。在Android系統中,Home應用程序是Launcher,下面將詳細分析Launcher應用程序的啓動過程。

Launcher由ActivityManagerService啓動,而ActivityManagerService是在開機時由SystemServer啓動,SystemServer首先須要啓動PackageManagerService,由它來負責啓動系統的應用程序。在系統中的應用程序啓動完成後,SystemServer接下來經過ActivityManagerService來啓動Launcher。Launcher在啓動的時候便會經過PackageManagerService把系統中已經啓動折應用程序以快捷圖標的形式展現在桌面上,這樣用戶就可使用系統應用程序了。

相關文章
相關標籤/搜索