Android软件安全与逆向分析之Dalvik
注意點
首先,讓我們來思考下面幾個問題:
什么是Dalvik虛擬機?
Dalvik VM與JVM有什么區(qū)別?
Dalvik VM有什么新的特點?
Dalvik VM的架構是怎么樣的?
首先,我得承認第一個問題問得很傻:什么是Dalvik虛擬機?沒有人給出過一個明確的定義,但是,我們似乎可以從人們對Java虛擬機的描述中得到些信息。
Java虛擬機(JVM)是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現(xiàn)的。它有自己完善的硬件架構(如處理器、堆棧、寄存器等),還具有相應的指令系統(tǒng)。使用“Java虛擬機”程序就是為了支持與操作系統(tǒng)無關、在任何系統(tǒng)中都可以運行的程序。
因此,我們不妨對Dalvik虛擬機作出這樣的描述:
Dalvik虛擬機是Android程序的虛擬機,是Android中Java程序的運行基礎。其指令集基于寄存器架構,執(zhí)行其特有的文件格式——dex字節(jié)碼來完成對象生命周期管理、堆棧管理、線程管理、安全異常管理、垃圾回收等重要功能。它的核心內容是實現(xiàn)庫(libdvm.so),大體由C語言實現(xiàn)。依賴于Linux內核的一部分功能——線程機制、內存管理機制,能高效使用內存,并在低速CPU上表現(xiàn)出的高性能。每一個Android應用在底層都會對應一個獨立的Dalvik虛擬機實例,其代碼在虛擬機的解釋下得以執(zhí)行。
與Dalvik虛擬機關系最密切的非JVM莫屬,在Android源碼readme文檔中有這樣一段話:Much of the code under this directory originally came from the Apache Harmony project, and as such contains the standard Apache header comment. Some of the code was written originally for the Android project…
Dalvik VM與Apache Harmony 項目關系源遠流長,因此,與JVM關系自然就密切了。
然而:Dalvik VM ≠Java VM
dalvik基于寄存器,而JVM基于stack
Dalvik執(zhí)行的是特有的DEX文件格式,而JVM運行的是*.class文件格式。
優(yōu)勢:1、在編譯時提前優(yōu)化代碼而不是等到運行時
2、 虛擬機很小,使用的空間也小;被設計來滿足可高效運行多種虛擬機實例。3、常量池已被修改為只使用32位的索引,以 簡化解釋器
JVM的字節(jié)碼主要是零地址形式的,概念上說JVM是基于棧的架構。Google Android平臺上的應用程序的主要開發(fā)語言是Java,通過其中的Dalvik VM來運行Java程序。為了能正確實現(xiàn)語義,Dalvik VM的許多設計都考慮到與JVM的兼容性;但它卻采用了基于寄存器的架構,其字節(jié)碼主要是二地址/三地址的混合形式。
基于棧與基于寄存器的架構,誰更快?現(xiàn)在實際的處理器,大多都是基于寄存器的架構,從側面反映出基于寄存器比基于棧的架構更與實際的處理器接近。但對于VM來說,源架構的求值棧或者寄存器都可能是用實際機器的內存來模擬的,所以性能特性與實際硬件又有不同。一般認為基于寄存器架構的Dalvik VM比基于棧架構JVM執(zhí)行效率更高,原因是:雖然零地址指令更緊湊,但完成操作需要更多的load/store指令,也意味著更多的指令分派(instruction dispatch)次數與內存訪問次數;訪問內存是執(zhí)行速度的一個重要瓶頸,二地址或三地址指令雖然每條指令占的空間較多,但總體來說可以用更少的指令完成操作,指令分派與內存訪問次數都較少。
轉載于:https://www.cnblogs.com/Tesi1a/p/7624131.html
總結
以上是生活随笔為你收集整理的Android软件安全与逆向分析之Dalvik的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 做梦梦到家里有好多蛇是什么征兆
- 下一篇: Android2.2 API 中文文档系