官术网_书友最值得收藏!

1.2 Android程序的執行流程

1.2.1 Android系統啟動過程

Android基于Linux內核系統,啟動時最先通過加載器bootloader加載Linux內核,然后初始化Linux內核,最后去調用初始化的init進程。Android從Linux系統啟動時一共經過了4個必需的步驟:

(1)init進程(即初始化進程)啟動。

(2)Native服務(即本地服務)啟動。

(3)System Server(即系統服務)和Android服務啟動。

(4)Home啟動。

總體的啟動過程框架圖如下圖所示。

1.第一步啟動:init進程啟動

init是一個由內核啟動的并且會對各種設備進行初始化操作的用戶級別的進程。內核會自動啟動,內核啟動之后會通過啟動一個用戶級程序init的方式,完成引導進程(其實大多數系統的init進程啟動都是這樣)。init進程是所有其他進程啟動的源頭,其下會衍生出“受精卵”Zygote、媒體服務media等進程,如下圖所示。

當系統啟動完成后,init進程將會作為守護進程監視其他進程,如果某個進程被監視到已經結束,init進程就會釋放這個結束的進程所占用的系統資源。

init進程的運行流程如下圖所示。

2.第二步啟動:“受精卵”Zygote進程啟動

Zygote進程的作用是每當要執行Java應用程序時,Zygote進程就會派生出執行Java應用的虛擬機的子進程,原因是Android的應用程序是使用Java語言寫成的,這些Java程序只能運行在Google自己設計的Dalvik虛擬機之上,而不是以本地進程的形式直接運行在Linux上。每個應用程序都運行在自己獨立的Dalvik虛擬機里。

Zygote啟動之后才會建立起真正的Android運行空間,初始化建立的Service都是本地服務(Navtive Service)。從Android源碼/system/bin/app_process中的main()函數(讀者可以在frameworks/base/cmds/app_process/app_main.cpp中找到main函數)中可以看出,app_process進程最先生成一個AppRuntime實例對象,然后開始分析main函數傳遞過來的參數,并且會將這些參數傳遞給AppRuntime對象。緊接著生成并且初始化Android虛擬機Dalvik,虛擬機參數完畢之后就開始執行ZygoteInit類的main函數。流程如下圖所示。

經過這幾個步驟,Zygote就建立好了。

3.第三步啟動:系統服務System Server啟動

具體流程圖如下圖所示。

System Server是Android系統一個非常重要的核心進程,從上圖可以看出,System Server是由Zygote進程創建而來的。startSystemServer()函數在Zygote上“fork”了一個進程,于是SystemServer就建立了。Android的所有服務循環框架都是建立系統服務SystemServer上的。

4.第四步啟動:Home啟動

當所有的Java系統服務加載啟動完成之后,ActivityManager Service就會運行啟動Home的應用。

系統在啟動完所有的Android服務后,做了這樣一些動作:

(1)使用systemReady()函數通知各個服務,系統已經就緒。

(2)對于ActivityManagerService.systemReady(回調),Home就是在ActivityManagerService. systemReady()通知的過程中建立起來的。

至此Android系統的啟動就完成了。

1.2.2 Android應用程序啟動過程

經過前面對Android項目目錄結構的介紹,以及相關文件的講解,我們對許多細節已經有所了解,那么Android程序是如何執行的呢?下面做一個總結。

程序發布程序到手機上之后,當雙擊“抽屜”里該應用程序的圖標時,系統會將這個單擊事件包裝成一個Intent,該Intent包含兩個參數:

{action :"android.intent.action.MAIN",
category :"android.intent.category.LAUNCHER" }

這個意圖被傳遞給應用程序之后,在應用程序的功能清單文件中尋找與該意圖匹配的意圖過濾器,如果匹配成功,則找到相匹配的意圖過濾器所在的Activity元素,再根據<activity>元素的“name”屬性來尋找其對應的Activity類。接著Android操作系統創建該Activity類的實例對象,對象創建完成之后,會執行該類的onCreate方法,此OnCreate方法是重寫其父類Activity的OnCreate方法而實現的。onCreate方法用來初始化Activity實例對象。以下是HelloWorld.java類中onCreate方法的代碼:

@Override
    public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}

其中,super.onCreate(savedInstanceState)的作用是調用其父類Activity的OnCreate方法來實現對界面的畫圖繪制工作。在實現自定義的Activity子類的OnCreate方法時,一定要記得調用該方法,以確保能夠繪制界面。

setContentView(R.layout.main)的作用是加載一個界面。該方法中傳入的參數是“R.layout.main”,其含義為R.java類中靜態內部類layout的靜態常量main的值,而該值是一個指向“res”目錄下的“layout”子目錄下main.xml文件的標識符。因此代表顯示main.xml所定義的畫面。

Android程序執行的整個序列圖如下圖所示。

主站蜘蛛池模板: 中阳县| 龙井市| 中山市| 开原市| 阿尔山市| 渝中区| 镇江市| 塔城市| 利川市| 玉屏| 安图县| 常宁市| 巫山县| 曲松县| 安多县| 康保县| 泗阳县| 南安市| 澄迈县| 五台县| 虎林市| 安新县| 庄浪县| 保亭| 弥渡县| 姚安县| 阳谷县| 汶上县| 无锡市| 德安县| 临湘市| 永康市| 铁岭县| 榆林市| 博爱县| 珲春市| 雅江县| 东兴市| 铁岭市| 德昌县| 莱州市|