Android系統Dalvik虛擬機是如何執行程序的?

分享黑客技術,GO、Python、Kotlin、Android、Java編程知識,科技資訊等

Android系統Dalvik虛擬機是如何執行程序的?

Android系統的架構採用分層思想,這樣的好處是減少各層之間的依賴性、便於獨立分發、容易收斂問題和錯誤等優點。Android系統由Linux內核、庫函數、Android運行時、應用程序框架以及應用程序組成。如下圖所示Android系統結構,Dalvik虛擬機屬於Android運行時環境,它與一些核心庫共同承擔Android應用程序的運行工作。

Android系統Dalvik虛擬機是如何執行程序的?

Android系統結構

Android系統啟動加載完內核後,第一個執行的是init進程,init進程首先要做的是設備的初始化工作,然後讀取init.rc文件並啟動系統中的重要外部程序Zygote。Zygote進程是Android所有進程的孵化器進程,它啟動後會首先初始化Dalvik虛擬機,然後啟動system_server並進入Zygote模式,通過socket等候命令。當執行一個Android應用程序時,system_server進程通過socket方式發送命令給Zygote,Zygote收到命令後通過fork自身創建一個Dalvik虛擬機的實例來執行應用程序的入口函數,這樣一個程序就啟動完成了。整個流程如下圖所示:

Android系統Dalvik虛擬機是如何執行程序的?

Android應用程序啟動過程

Zygote提供了三種創建進程的方法:

  • fork(),創建一個Zygote進程;

  • forkAndSpecialize(),創建一個非Zygote進程;

  • forkSystemServer(),創建一個系統服務進程;

其中,Zygote進程可以再fork()出其他進程,非Zygote進程則不能fork其他進程,而系統服務進程在終止後它的子進程也必須終止。

當進程fork成功後,執行的工作就交給了Dalvik虛擬機。Dalvik虛擬機首先通過loadClassFromDex()函數完成類的裝載工作,每個類被成功解析後都會擁有一個ClassObject類型的數據結構存儲在運行時環境中,虛擬機使用gDvm.loadedClassed全局哈希表來存儲與查詢所有裝載進來的類,隨後字節碼驗證器使用dvmVerifyCodeFlow()函數對裝入的代碼進行校驗,接著虛擬機調用FindClass()函數查找並裝載main方法類,隨後調用dvmInterpret()函數初始化解釋器並執行字節碼流。如下圖所示:

Android系統Dalvik虛擬機是如何執行程序的?

Dalvik虛擬機執行程序流程

您喜歡這篇文章可以點贊,關注,轉發,評論!

相關閱讀:





分享到:


相關文章: