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

Android Framework是怎麼啟動的?

編輯:關於Android編程

Framework運行環境是怎樣的?

安卓系統啟動過程其實是建立一套系統運行需要的環境。
Framework運行環境如下:

這裡寫圖片描述

安卓系統中運行的第一個Dalvik虛擬機叫做zygote,意思是“卵”。這個“卵”還是挺有用的,因為接下來所有的Dalvik虛擬機進程都是這個“卵”孵化出來的。

zygote進程中包含兩個主要模塊,分別如下:<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NClNvY2tldLf+zvG2y6Gj08PT2r3TytXG9Lav0MK1xERhbHZpa734s8y1xMP8we6hoyBGcmFtZXdvcmu5ss/twOC8sLmyz+3XytS0oaO1sXp5Z290Zb34s8zG9LavuvO74bzT1NjSu9CpubLP7bXEwOC8sNfK1LSjrMbk1tC5ss/twODKx9TacHJlbG9hZC1jbGFzc2VzzsS8/tbQsbu2qNLltcSjrLmyz+3XytS0ysfU2nByZWxvYWQtcmVzb3VyY2Vz1tCxu7ao0uW1xKGjxuTL+0RhbHZpa734s8zKx7G7enlnb3RlvfizzLf1u6+z9sC0tcSjrMv50tTV4tCpwOC6zdfK1LS809TYuvOjrNDCtcREYWx2aWu9+LPMvs2/ydLU1rG908q508PV4tCpwOC6zdfK1LS+zbTvtb3By7myz+3Ev7XEoaMNCjxwPnp5Z290Zb34s8y21NOmtcSzzNDyysdhcHBfcHJvY2Vzcyy4w7PM0PLU2nN5c3RlbS9iaW7Ev8K8z8KhozwvcD4NCjxwPnp5Z290Zbf1u6+z9rXEtdrSu7j2RGFsdmlrvfizzMrHU3lzdGVtU2VydmVyo6y4w734s8y21NOmtcSzzNDy0sDIu8rHYXBwX3Byb2Nlc3Ms0vLOqrjDvfizzMrHtNNhcHBfcHJvY2Vzc9bQt/W7r7P2wLS1xKGjPC9wPg0KPHA+U3lzdGVtU2VydmVy1tC0tL2owcvSu7j2U29ja2V0v827p7bLo6zWrrrzy/nT0LXERGFsdmlrvfizzLa8vavNqLn9uMNTb2NrZXS/zbuntsu85L3TsbvG9Lavo6xBbXO4utTwudzA7dXiuPa/zbuntsuho8jnufvQ6NKqxvS2r9DCtcRBUEu9+LPMyrGjrEFtc7vhzai5/bjDU29ja2V0v827p7bLz/J6eWdvdGW9+LPMtcRTb2NrZXS3/s7xtsu3osvN0ru49sb0tq/D/MHuo6zIu7rzenlnb3Rlu+G39buvs/bQwrXEvfizzKGjPC9wPg0KPHA+1eLR+bXEvNy5udPQwb249szYteOjujwvcD4NCsO/0ru49r34s8y2vMrH0ru49kRhbHZpa9DpxOK7+qOsRGFsdmlr0OnE4rv6ysfSu9bWwODLxtPaamF2YdDpxOK7+rXEs8zQ8qGjIHp5Z290Zb34s8y74dSkz8jXsNTYubLP7cDgus25ss/t18rUtKOs1eLQqcDgus3XytS0xuTKtb7NysdTREvW0Lao0uW1xLTzsr+31sDgus3XytS0oaO1sc2ouf16eWdvdGW39buvs/bQwr34s8y686Os0MK1xEFQS9a70OjSqsilvNPU2EFQS9fUye2w/LqstcTA4LrN18rUtKOs1eLR+bbguPZBUEu+zb/J0tS5ss/tRnJhbWV3b3Jr18rUtMHLoaMNCjxoMiBpZD0="和dalvik虛擬機有聯系的可執行程序有哪些">和Dalvik虛擬機有聯系的可執行程序有哪些?

1.dalvikvm

java程序運行時都是由一個虛擬機來解釋java字節碼,將這些字節碼翻譯成本地CPU指令碼然後執行。dalvikvm的作用就是創建一個虛擬機並執行參數中指定的java類。

2.dvz

dvz的作用是從zygote進程中孵化出一個新的進程,新進程其實就是一個Dalvik虛擬機。該進程與dalvikvm啟動的虛擬機相比,區別是該進程中已經預裝了Framework的大部分類和資源。

3.app_process

Framework在啟動時需要加載運行兩個特定java類,一個是ZygoteInit.java,一個是SystemServer.java。為了方便使用,系統才提供了一個app_process進程,該進程會自動運行這兩個類,app_process其實就是使用dalvikvm啟動ZygoteInit.java,啟動後會加載Framework中得大部分類和資源。

Zygote是如何啟動的?

1.在init.rc中配置Zygote啟動參數

2.啟動Socket服務端口

當Zygote服務從app_process開始啟動後,會啟動一個Dalvik虛擬機,虛擬機第一個執行的java類就是ZygoteInit.java,該類第一個重要的工作就是啟動一個Socket服務端口,該Socket端口用於接收啟動新進程的命令。

3.加載preload-classes

在Zygote類的main()函數中,創建完Socket服務端後還不能立即孵化出新的進程,因為這個“卵”還沒有必須的“核酸”,這個“核酸”就是指預裝的Framework大部分類及資源。

4.加載preload-resources

preload-resources包含兩類資源,一類是drawable資源,一類是color資源。加載這些資源是在preloadResource()函數中完成的,該函數調用preloadDrawable()和preloadColorStateLists()加載這兩類資源,原理就是把這些資源讀出來放到一個全局變量中,只要該類對象不被銷毀,這些全局變量就會一直保存。

5.使用fork啟動新的進程

fork是Linux系統的一個系統調用,作用就是復制當前進程產生一個新的進程。除了進程id不同,新進程將擁有和原始進程完全相同的進程信息。進程的信息包括該進程所打開的文件描述符列表、所分配的內存等。當新進程被創建後,兩個進程將共享已經分配的內存空間,如果其中一個需要向內存中寫入數據時,操作系統才復制一份目標地址空間,並將要寫的數據寫入到新的地址中。這種“僅當寫的時候才復制”的機制可以最大限度的在多個進程中共享物理內存。

舉個栗子:

去烏鎮見一下習大大和去烏鎮吃一次丁磊的豬肉,這是兩個進程,但是兩個進程中的很多任務是相同的,先訂機票,做地鐵到機場,做幾小時飛機過去。到了之後不同的就是見習大大和吃豬肉。如果可以先雇一個秘書進程讓它訂機票、做地鐵、做飛機,到烏鎮。然後秘書在復制出兩個秘書,一個去見習大大,一個去吃豬肉,好處是節省了大量內存。

Zygote進程就是本例中的“秘書進程”,那些“訂機票、做地鐵、乘飛機”就是Zygote進程中加載的preload-classes類的功能。

這樣新的進程就脫離的Zygote進程的孵化成為一個真正的應用進程。

SystemServer 進程是如何啟動的?

SystemServer進程是Zygote孵化出的第一個進程,然後再配置SystemServer進程的環境。

1.啟動各種系統服務線程

SystemServer進程在Android運行環境中扮演了“神經中樞”的作用,APK應用中能夠直接交互的大部分系統服務都在該進程中運行,常見的有WindowManagerServer(Wms)、ActivityManagerService(Ams)、PackageManagerServer(Pms),這些系統服務都是以一個線程的方式存在於SystemServer進程中。

2.啟動第一個Activity

當以上服務線程都啟動後,其中Ams服務是systemReady()調用完成最後啟動的,在Ams的systemReady()函數的最後一段代碼則發出了啟動任務隊列中最上面一個Activity消息。

在Ams的startHomeActivityLocked()中,系統發出了一個category字段包含CATEGORY_HOME的intent,代碼如下:

intent.setComponent(mTopComponent);
if(mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL){
intent.addCategory(Intent.CATEGORY_HOME);
}

只要應用聲明自己能夠響應該Intent,那麼就可以被認為是Home程序。當系統中有多個程序能夠響應該Intent時,系統會彈出一個對話框,讓用戶選擇啟動哪個程序,也允許用戶記住該選擇。

到此第一個Activity就啟動了。

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