轉自:http://blog.csdn.net/virus026/archive/2010/12/19/6085779.aspx
Android 運行環境主要指的虛擬機技術——Dalvik。Android中的所有Java程序都是運行在Dalvik VM上的。Android上的每個程序都有自己的線程,DVM只執行.dex的Dalvik executable 文件。每個Android應用在底層都對應有一個獨立的DVM實例並在其解釋下執行。
雖然DVM也是用Java編程語言,Dalvik虛擬機和一般JAVA虛擬機(Java VM)並不兼容,他們兩個的區別是JVM標準執行的是.class的字節碼(bytecode ),而是DVM執行的是其專有的(.dex)執行文件。在編譯過程中,Java把類編譯成一個或多個.class byte code 文件,然後打包到jar中,JVM會從中jar文件中獲得相應的.class文件和JRE字節碼。 Android VM雖然也是是用Java語言進行編程, Java程序通過編譯後,還需要通過SDK中的dex工具轉化成.dex格式,DVM再從其中讀取指令和數據。
每一個應用程序即一個進程(Linux的一個Process)。二者最大的區別在於Java VM是以基於棧的虛擬機(Stack-based),而Dalvik是基於寄存器的虛擬機(Register-based)。顯然,後者最大的好處在於可以根據硬件實現更大的優化,這更適合移動設備的特點。
•使用專有的.dex格式。
•原因是java類文件在編譯過後,會產生至少一個.class文件包含大量陳餘信息,dex文件格式會把所有的.class文件內容整合到一個.dex文件中。即減少了整體文件的尺寸和IO操作,也提高了類的查找速度。
•增加了對新的操作碼的支持
•文件結構儘量簡潔,使用等長的指令,藉以提高解析速度。
•儘量擴大隻讀結構的大小,藉以提高跨進程的數據共享。
•dex的優化,dex文件的結構是緊湊的,但是如果想提高運行時的性能,就需要對dex文件進行進一步的優化,這些優化針對以下幾個方面:
•驗證dex文件中的所有類
•對一些特定的類和方法裏面的操作碼進行優化•調整所有的字節序(Little_endian)和對齊結構中的每一個域
•基於寄存器,基於寄存器的虛擬機雖然比基於堆棧的虛擬機在硬件,通用性上要差一些,但是它的代碼執行效率去更好
•每一個Android應用都運行在它自己的DVM實例中,每一個DVM實例都是一個獨立的進程空間。所有的Android應用的線程都對應一個Linux線程,DVM因此可以更多地依賴操作系統的線程調度和管理機制。不同的應用在不同的進程空間裏運行,不同的應用都是用不同的Linux用戶來運行以最大程度地保戶應用程序的安全性和獨立性