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

Android Framework是怎麼啟動的?

編輯:關於android開發

Android Framework是怎麼啟動的?


Framework運行環境是怎樣的?

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

這裡寫圖片描述

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

zygote進程中包含兩個主要模塊,分別如下:

Socket服務端。用於接收啟動新的Dalvik進程的命令。 Framework共享類及共享資源。當zygote進程啟動後會加載一些共享的類及資源,其中共享類是在preload-classes文件中被定義的,共享資源是在preload-resources中被定義的。其他Dalvik進程是被zygote進程孵化出來的,所以這些類和資源加載後,新的Dalvik進程就可以直接使用這些類和資源就達到了共享目的。

zygote進程對應的程序是app_process,該程序在system/bin目錄下。

zygote孵化出的第一個Dalvik進程是SystemServer,該進程對應的程序依然是app_process,因為該進程是從app_process中孵化出來的。

SystemServer中創建了一個Socket客戶端,之後所有的Dalvik進程都將通過該Socket客戶端間接被啟動,Ams負責管理這個客戶端。如果需要啟動新的APK進程時,Ams會通過該Socket客戶端向zygote進程的Socket服務端發送一個啟動命令,然後zygote會孵化出新的進程。

這樣的架構有兩個特點:

每一個進程都是一個Dalvik虛擬機,Dalvik虛擬機是一種類似於java虛擬機的程序。 zygote進程會預先裝載共享類和共享資源,這些類和資源其實就是SDK中定義的大部分類和資源。當通過zygote孵化出新進程後,新的APK只需要去加載APK自身包含的類和資源,這樣多個APK就可以共享Framework資源了。

和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