天天看點

android應用程式啟動詳情之Dalvik虛拟機

本文主要讨論Android啟動一個應用時一些背景相關的流程。

Dalvik虛拟機  -》 程序啟動 -》 建立UI線程

總體概念: 一個應用,一個虛拟機執行個體,一個程序,一個UI線程

1. Dalvik虛拟機基本知識介紹

基本概念

Dalvik虛拟機是Android程式的虛拟機,其指令集基于寄存器架構,執行其特有的檔案格式——dex位元組碼,主要負責完成對象生命周期管理、堆棧管理、線程管理、安全異常管理、垃圾回收等重要功能。

android使用的Java代碼,跟Java 虛拟機類似,是Android中Java程式的運作基礎。

但是dalvik虛拟機與Java虛拟機有較大差別:

      1)、dalvik基于寄存器,而JVM基于stack

      2)、Dalvik執行的是特有的DEX檔案格式,而JVM運作的是*.class檔案格式。

優勢:

      1)、在編譯時提前優化代碼而不是等到運作時

      2)、 虛拟機很小,使用的空間也小;被設計來滿足可高效運作多種虛拟機執行個體。

      3)、常量池已被修改為隻使用32位的索引,以 簡化解釋器

   以下是Android Dalvik虛拟機的架構

android應用程式啟動詳情之Dalvik虛拟機

2、 Dalvik程序管理:

           dalvik程序管理是依賴于linux的程序體系結構的,如要為應用程式建立一個程序,它會使用linux的fork機制來複制一個程序(複制程序往往比建立程序效率更高)。

Zygote是一個虛拟機程序,同時也是一個虛拟機執行個體的孵化器,它通過init程序啟動。首先會孵化出System_Server(android絕大多系統服務的守護程序,它會監聽socket等待請求指令,當有一個應用程式啟動時,就會向它送出請求,zygote就會FORK出一個新的應用程式程序).每當系統要求執行一個android應用程式時,Zygote就會運用linux的FORK進制産生一個子程序來執行該應用程式。

          不同的應用在不同的程序空間裡運作,當一個虛拟機關閉或意外中止時不會對其它 虛拟機造成影響,可以最大程度的保護應用的安全和獨立運作。

         以下是Android Dalvik 在收到一個啟動activity時fork一個程序的過程。

android應用程式啟動詳情之Dalvik虛拟機

3. Android記憶體管理

關于記憶體管理這篇文章介紹的很詳細:Android記憶體管理

這裡主要介紹标注并清理回收法(Mark and Sweep GC)

在這個算法中,程式在運作的過程中不停的建立新的對象并消耗記憶體,直到記憶體用光,這時再要建立新對象時,系統暫停其它元件的運作,觸發GC線程啟動垃圾回收過程。記憶體回收的原理很簡單,就是從所謂的"GC Roots"集合開始,将記憶體整個周遊一次,保留所有可以被GC Roots直接或間接引用到的對象,而剩下的對象都當作垃圾對待并回收

•标注(Mark)階段:首先針對GC Roots中的每一個對象,采用遞歸調用的方式處理其直接和間接引用到的所有對象:

•清理(SWEEP)階段:即執行垃圾回收過程,留下有用的對象,GC線程周遊整個記憶體,将所有沒有标注的對象(即垃圾)全部回收,并将保留下來的對象的标志清除掉,以便下次GC過程中使用

4.  APK 生成過程

android應用程式啟動詳情之Dalvik虛拟機
android應用程式啟動詳情之Dalvik虛拟機

 參考資料:

Android Dalvik虛拟機初識

了解Android虛拟機體系結構