Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android系統的啟動過程

Android系統的啟動過程

編輯:關於Android編程

當我們拿到一台Android的智能手機,從打開開關,到我們可以使用其中的app時,這個啟動過程到底是怎麼樣的?

\

系統上電

當給Android系統上電,CPU復位之後,程序指針會指向啟動地址,從該地址讀取啟動程序的可執行代碼直接運行,或者將可執行代碼與數據載入CPU內置的RAM中再運行。

CPU復位,其實就是在電源接通的瞬間,CPU內的寄存器和各引腳均會被置為初始狀態,並將程序指針指向引導程序的位置。<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+1eLSu7bOtPrC66Ost8XU2lBD1tCjrL3Q1/ZCSU9To6y2+NTaQW5kcm9pZLXIx7bI68q9z7XNs9bQvs290Nf2Qm9vdGxvYWRlcqGjPC9wPgo8aDI+Qm9vdGxvYWRlctL9tbyzzNDyPC9oMj4KPHA+zai5/UJvb3Rsb2FkZXLS/bW8s8zQ8qOsv8nS1LP1yry7r9OyvP7J6LG4o6y9qMGixNq05r/VvOTTs8nkzbyjrM6qstnX98+1zbPE2rrL17yxuLrDu7e+s6OszeqzydX7uPbPtc2ztcS809TYxvS2r8jOzvGhoyAgICA8L3A+CjxwPiAgICA8aW1nIHNyYz0="/uploadfile/Collfiles/20140713/20140713101809101.png" alt="\">

Bootloader是支持交互式操作的,一般刷機中會用到的Fastboot模式,就是在Bootloader啟動之後,根據用戶輸入的指令(在手機上用音量鍵,Home健等操作),停留在當前狀態。

而正常情況下,Bootloader程序執行完成之後,就會開始加載Android操作系統。

加載內核

我們知道Android操作系統的內核其實就是Linux內核。當Bootlader引導程序啟動之後,就會進入Linux的內核引導階段。

引導階段會初始化內核和設備驅動,接著啟動內核,掛載文件系統,最後啟動用戶空間進程。

Init程序

Init程序是用戶空間的第一個進程。它負責解析一個叫做init.rc的配置文件,啟動Android系統底層運行的一些服務進程。

init.rc文件定義了不同的Action和Service,其格式如下:

Action

on boot
     ...
     class_start core
     class_start main

Action是以關鍵字on來定義的,緊接著的boot是一個觸發條件,如上面的action表明當Android啟動(boot)的時候,要做些什麼事情。

Service

service servicemanager /system/bin/servicemanager #聲明一個service,而servicemanager則是其名字
     class core                          #optioin, 該service屬於core類
     user system                         $option,該service屬於System用戶
     group System

Service是以關鍵字servie來定義的,緊跟著的是其名字和其啟動的文件,如上面,會執行/system/bin/serviemanager文件,並將其命名為 servicemanager。

如上,Action boot之後的class_start core等,是Init程序在開機時會啟動的服務。

這些服務包括ueventd, servicemanager, void, zygote, installd, ril-daemon等,我們一般稱它們為守護進程。

Init程序同時也會開啟屬性服務,存放一些關於Android系統的全局系統設置信息。

最後,當所有的Action和Service都啟動完成之後,Init程序就會進入一個無限的循環,監聽系統中發生的事件,對一些事件進行處理,比如重啟某些服務等。

ServiceManager

ServiceManager是Init程序啟動的守護進程之一,它是Android中Binder通信的基礎。

ServiceManager提供了注冊,檢索服務的功能。在zygote子進程system_server(在下面)啟動的每一項服務都會將其注冊到ServiceManager中,由ServiceManager來統一進行管理。值得注意的是,ServiceManager本身也是一個Service,所以它也會將自己注冊到自身上面。

而ServiceManager啟動的過程做了三件事:

1)打開Binder設備,把Binder設備映射到內核空間中,由於內核空間是所有進程共享的區域,所以借助這塊區域,可以實現不同進程間資源的共享,從而達到進程間通信。

2)ServiceManager本身會變成一個ContextManager,即上面所說的注冊到自己身上,負責各種Service的上下文管理。

3)最終ServiceManager也是會進入一個無限循環。

Zygote

Zygote也是由Init程序啟動的其中一個服務,但它卻是Android世界中的第一個Dalvik虛擬機。在之後,所有的Dalvik虛擬機都是由Zygote孵化出來的,這是因為Android中每一個應用都有著自己的進程,而每一個進程中都著一個Dalvik虛擬機,如果每起一個應用就創建一個虛擬機,效率太低,而通過復制Zygote,不僅可以提高創建的速度,還能夠共享系統和框架的資源,可以大幅度提高應用程序啟動的速度。

Zygote啟動之後

1)首先會創建一個socket,等待某個客戶端的請求。

2)接著創建其第一個子線程,叫做system_server。system_server會開啟Android系統的Native Service和Java Service。

其中Native Service就是那些利用JNI實現的共享庫,而Java Service則是通過Java語言實現的ActivitManagerService等,都是在這個階段由system_server啟動並注冊到一個叫ServiceManager的服務進程中。

ActivityManagerService啟動之後,會進入到一個叫System Ready的狀態,而在其達到System Ready的狀態之前呢,就會啟動一個叫做Launcher的應用,而這個Launcher就是Android系統啟動成功之後見到的Home桌面了。

而在SystemReady的狀態,其會跟Zygote啟動之初的Socket進行通信,告訴zygote,一切已經就緒。

3)Zygote知道已經啟動成功,就開始進入一個無限的循環,在Socket上等待請求的到來。

至此,從手機上電的那一刻起,到加載內核,到最後顯示Home桌面的整個過程就結束了,而這篇文章想介紹的也差不多了。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved