Android內核開發:圖解Android系統的啓動過程

本文是《Android內核開發》系列的第六篇文章,前面的幾篇文章介紹了Android內核開發相關的基礎知識,包括:Android源碼的下載、版本和分支介紹、編譯和燒寫等等,從本文起就要開始真正地進行Android內核的學習及實戰了。linux

學習任何軟硬件系統,研究系統啓動過程都是一種很是有效地起步手段,搞Android內核開發也不例外。網上有不少文章對Android啓動相關代碼進行分析和走讀,你們能夠先搜索閱讀一下,我我的更喜歡更加直觀的方式去理解未知的東西,包括圖、表、系統輸出的log信息等等,所以,本文準備經過一些流程圖和log信息,來探索一下Android的啓動過程。android

首先,給出一張圖,圖片來自這裏,我以爲它畫得很好,就引用過來了,幫助你們理解和分析。shell

 

wKioL1V0NLqz5WkHAAFZtLWnJvI406.jpg

第一階段:Android設備上電後,首先會從處理器片上ROM的啓動引導代碼開始執行,片上ROM會尋找Bootloader代碼,並加載到內存。(這一步由「芯片廠商」負責設計和實現)微信

 

第二階段:Bootloader開始執行,首先負責完成硬件的初始化,而後找到Linux內核代碼,並加載到內存。(這一步由「設備廠商」負責設計和實現)併發

 

第三階段:Linux內核開始啓動,初始化各類軟硬件環境,加載驅動程序,掛載根文件系統,並執行init程序,由此開啓Android的世界。(這一步則是Android內核開發過程當中須要涉及的地方)app

 

Android系統以及各大Linux的發行版,他們的Linux內核部分啓動過程都是差很少的,他們之間最大的區別就在於init程序的不一樣,由於init程序決定了系統在啓動過程當中,究竟會啓動哪些守護進程和服務,以及呈現出怎樣的一個用戶UI界面。學習

 

所以,init程序是分析Android啓動過程當中最核心的程序。.net

 

對應的代碼位於:system/core/init/init.c,工做內容如圖所示(圖片來自《Embedded Android》這本書):線程

 

wKiom1V0M1eT5QMVAAGjy48aLpE827.jpg

 

init程序最核心的工做主要有3點:debug

 

(1) 建立和掛載一些系統目錄/設備節點,設置權限,如:/dev, /proc, and /sys

 

(2) 解析 init.rc 和 init.<hardware>.rc,並啓動屬性服務,以及一系列的服務和進程。

 

(3) 顯示boot logo,默認是「Android」字樣

 

其中,最重要的步驟是第二步,一系列的Android服務在這時被啓動起來,其實Android系統的啓動最重要的過程也就是各個系統服務的啓動,由於系統全部的功能都是依賴這些服務來完成的,好比啓動應用程序,撥打電話,使用WIFI或者藍牙,播放音視頻等等,只要這些服務都能正常地啓動起來而且正常工做,整個Android系統也就完成了本身的啓動。

 

這些服務包含2部分,一部分是本地服務,另外一部分是Android服務,全部的這些服務都會向ServiceManager進程註冊,由它統一管理,這些服務的啓動過程介紹以下:

 

(1)本地服務

 

本地服務是指運行在C++層的系統守護進程,一部分本地服務是init進程直接啓動的,它們定義在init.rc腳本和init.<hardware>.rc中,如 ueventd、servicemanager、debuggerd、rild、mediaserver等。還有一部分本地服務,是由這些本地服務進一步建立的,如mediaserver服務會啓動AudioFlinger, MediaPlayerService, 以及 CameraService 等本地服務。

 

咱們能夠經過查看init.rc和init.<hardware>.rc文件找出具體有哪些本地服務被init進程直接啓動了,這些文件的位置:system/core/rootdir/

 

注意,每個由init直接啓動的本地服務都是一個獨立的Linux進程,在系統啓動之後,咱們經過adb shell命令進入手機後,輸入top命令就能夠查看到這些本地進程的存在:

 

wKiom1V0M3mRuBOAAAiGldvIXg0202.jpg

 

(2)Android服務

 

Android服務是指運行在Dalvik虛擬機進程中的服務,這些服務的建立過程描述以下:

 

init進程會執行app_process程序,建立Zygote進程,它是Android系統最重要的進程,全部後續的Android應用程序都是由它fork出來的。

 

Zygote進程會首先fork出"SystemServer"進程,"SystemServer"進程的所有任務就是將全部的Android核心服務啓動起來,這些服務包括:

 

wKiom1V0M6KDKc28AAUZgS6gxZ0002.jpg

 

當全部的服務都啓動完畢後,SystemServer會打印出「Making services ready」,而後經過ActivityManager啓動Home界面,併發送「ACTION_BOOT_COMPLETED」廣播消息。

 

注意,這些Android服務並無各類運行在獨立的進程中,它們由SystemServer以線程的方式建立,因此都運行在同一個進程中,即SystemServer進程中。

 

(3) 小結

 

上面的幾張圖我總以爲還不夠盡興,所以文章最後,再給出一張圖幫助你們加深一下理解,這幅圖來自《Improving the Boot Time of the Android OS》這篇論文。

 

wKioL1V0NWmiHTYHAAJuMBfXId4365.jpg

關於圖解Android系統的啓動過程就介紹到這裏了

 

結束語

 

免費學習更多精品課程,登陸樂搏學院官網http://h.learnbo.cn/

或關注咱們的官方微博微信,還有更多驚喜哦~

 

本文出自 「Jhuster的專欄」 博客,請務必保留此出處http://ticktick.blog.51cto.com/823160/1659473

相關文章
相關標籤/搜索