Android技術要點概括(二)-Dalvik虛擬機篇

1、什麼是Dalvik虛擬機java

Dalvik是Google公司本身設計用於Android 平臺的Java虛擬機,具備高效、簡潔、節省資源的特色,從Android系統架構圖知,Dalvik虛擬機運行在Android的運行時庫層安全

Dalvik做爲面向Linux、爲嵌入式操做系統設計的虛擬機,主要負責完成對象生命週期管理、堆棧管理、線程管理、安全和異常管理,以及垃圾回收等架構

2、Dalvik虛擬機的特色app

  1. 體積小,佔用內存空間小
  2. 專有的dex可執行文件格式,體積更小,執行速度更快。
  3. 常量池採用32位索引值,尋址類方法名,字段名,常量更快
  4. 基於寄存器架構,並擁有一套完整的指令系統。
  5. 提供了對象生命週期管理,堆棧管理,線程管理,安全和異常管理以及垃圾回收等重要功能。
  6. 全部的Android程序都運行在Android系統進程裏,每一個進程對應一個Dalvik虛擬機實例。

3、Dalvik虛擬機和Java虛擬機的區別工具

Java虛擬機運行的是Java字節碼,Dalvik虛擬機運行的Dalvik字節碼ui

傳統的Java程序通過編譯,生成Java字節碼保存在class文件中,Java虛擬機經過解碼class文件中的內容運行程序。 而Dalvik虛擬機運行的是Dalvik字節碼,全部的Dalvik字節碼由Java字節碼轉換而來,並被打包到一個dex文件中,Dalvik虛擬機經過解析dex文件來執行這些字節碼。操作系統

Dalvik可執行文件體積小,Android SDK中有一個叫dx的工具負責將Java字節碼轉換成Dalvik字節碼。線程

dx工具對Java類文件從新排列,消除在文件中出現的全部的冗餘信息,避免虛擬機在初始化時出現反覆的文件加載和解析過程。 通常狀況下,Java類文件中包含多個不一樣的方法簽名,若是其餘的類文件引用該類文件中的防範, 方法簽名也會被複制到其餘類文件中,也就是說, 多個不一樣的類會同時包含相同的方法簽名,一樣的,大量的字符串常量在多個類文件中也會被重複使用,這些冗餘信息會直接增長文件的體積,同時也會影響虛擬機解析文件的效率。消除其中的冗餘信息,從新組合成一個常量池,全部的類文件共享一個常量池,因爲dx工具對常量池的壓縮,使得相同的字符串,常量在dex文件中只出現一次,從而減少了文件的體積。設計

Java虛擬機與Dalvik虛擬機架構不一樣。這也是它們之間最大的區別。3d

  • Java虛擬機基於棧架構,程序在運行時虛擬機須要頻繁的從站上讀取或者寫入數據,這個過程須要更多的指令分派與內存訪問次數,會耗費很多CPU時間,對於像手機這種資源有限的設備來講,這是至關大的一筆開銷
  • Dalvik虛擬機基於寄存器架構,數據的訪問經過寄存器直接傳遞,這樣的訪問方式比基於棧方式要快不少。

4、Dalvik虛擬機結構

一個程序首先通過dx工具將class文件轉換成Dalvik虛擬機能夠執行的dex文件,而後由類加載器加載原生類和Java類,接着由解釋器根據指令集對Dalvik字節碼進行解析、執行,最後,根據dvm_arch參數選擇編譯的目標體系結構。

5、Android APK 編譯打包流程

  1. Java編譯器對工程自己的Java代碼進行編譯,這些java代碼有三個來源:app的源代碼、由資源文件生成的R文件以及有aidl文件生成的java接口文件。產出爲.class 文件。 ① 用AAPT編譯R.java文件 ② 編譯AIDL的java文件 ③ 把java文件編譯成class文件
  2. .class文件和依賴的三方庫文件經過dex工具生成Dalvik虛擬機可執行的.dex文件,包含了全部的class信息,包括項目自己的class和依賴的class,產生出.dex文件。
  3. apkbuilder 工具將.dex 文件和編譯後的資源文件生成未經簽名對齊的apk文件,這裏編譯後的資源文件包括兩部分,一是由aapt編譯產生的編譯後的資源文件,二是依賴的三方庫裏的資源文件,產生爲未經簽名的apk文件。
  4. 分別由Jarsigner和zipalign對apk文件進行簽名和對齊,生成最終的apk文件。

總結:編譯-> Dex -> 打包 -> 簽名和對齊

相關文章
相關標籤/搜索