Android核心開發:圖解Android系統的啟動過程

來源:互聯網
上載者:User

標籤:啟動   開發   核心   boot   android   

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


學習任何軟硬體系統,研究系統啟動過程都是一種非常有效地起步手段,搞Android核心開發也不例外。網上有很多文章對Android啟動相關代碼進行分析和走讀,大家可以先搜尋閱讀一下,我個人更喜歡更加直觀的方式去理解未知的東西,包括圖、表、系統輸出的log資訊等等,因此,本文準備通過一些流程圖和log資訊,來探索一下Android的啟動過程。


首先,給出一張圖,圖片來自這裡,我覺得它畫得很好,就引用過來了,協助大家理解和分析。


650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6E/1C/wKioL1V0NLqz5WkHAAFZtLWnJvI406.jpg" title="1.png" alt="wKioL1V0NLqz5WkHAAFZtLWnJvI406.jpg" />

第一階段:Android裝置上電後,首先會從處理器片上ROM的啟動引導代碼開始執行,片上ROM會尋找Bootloader代碼,並載入到記憶體。(這一步由“晶片廠商”負責設計和實現)


第二階段:Bootloader開始執行,首先負責完成硬體的初始化,然後找到Linux核心代碼,並載入到記憶體。(這一步由“裝置廠商”負責設計和實現)


第三階段:Linux核心開始啟動,初始化各種軟硬體環境,載入驅動程式,掛載根檔案系統,並執行init程式,由此開啟Android的世界。(這一步則是Android核心開發過程中需要涉及的地方)


Android系統以及各大Linux的發行版,他們的Linux核心部分啟動過程都是差不多的,他們之間最大的區別就在於init程式的不同,因為init程式決定了系統在啟動過程中,究竟會啟動哪些守護進程和服務,以及呈現出怎樣的一個使用者UI介面。


因此,init程式是分析Android啟動過程中最核心的程式。


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


650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6E/20/wKiom1V0M1eT5QMVAAGjy48aLpE827.jpg" title="2.png" alt="wKiom1V0M1eT5QMVAAGjy48aLpE827.jpg" />


init程式最核心的工作主要有3點:


(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/init/rootdir/


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


650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6E/20/wKiom1V0M3mRuBOAAAiGldvIXg0202.jpg" title="3.png" alt="wKiom1V0M3mRuBOAAAiGldvIXg0202.jpg" />


(2)Android服務


Android服務是指運行在Dalvik虛擬機器進程中的服務,這些服務的建立流程說明如下:


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


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


650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6E/20/wKiom1V0M6KDKc28AAUZgS6gxZ0002.jpg" title="4.png" alt="wKiom1V0M6KDKc28AAUZgS6gxZ0002.jpg" />


當所有的服務都啟動完畢後,SystemServer會列印出“Making services ready”,然後通過ActivityManager啟動Home介面,並發送“ACTION_BOOT_COMPLETED”廣播訊息。


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


(3) 小結


上面的幾張圖我總覺得還不夠盡興,因此文章最後,再給出一張圖協助大家加深一下理解,這幅圖來自《Improving the Boot Time of the Android OS》這篇論文。


650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6E/1C/wKioL1V0NWmiHTYHAAJuMBfXId4365.jpg" title="123.png" alt="wKioL1V0NWmiHTYHAAJuMBfXId4365.jpg" />

關於圖解Android系統的啟動過程就介紹到這裡了,有任何疑 問或者建議歡迎留言或者來信[email protected]交流,或者關注我的新浪微博 @盧_俊 擷取最新的文章和資訊。


本文出自 “對影成三人” 部落格,請務必保留此出處http://ticktick.blog.51cto.com/823160/1659473

Android核心開發:圖解Android系統的啟動過程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.